From 6d744374db5ac64fc538f89412eb91f4798187b0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 12 May 2020 11:22:25 +0200 Subject: [PATCH 01/63] [tracking] Use enum-conveniences --- src/modules/tracking/TrackingType.h | 12 +++++++++--- src/modules/tracking/TrackingViewStep.cpp | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/modules/tracking/TrackingType.h b/src/modules/tracking/TrackingType.h index 02dbd934e..04e8d2ebe 100644 --- a/src/modules/tracking/TrackingType.h +++ b/src/modules/tracking/TrackingType.h @@ -19,11 +19,17 @@ #ifndef TRACKINGTYPE_H #define TRACKINGTYPE_H +#include "utils/NamedEnum.h" + enum class TrackingType { - InstallTracking, - MachineTracking, - UserTracking + NoTracking, // Do not enable tracking at all + InstallTracking, // Track that *this* install has happened + MachineTracking, // Track the machine, ongoing + UserTracking // Track the user, ongoing }; +// Implemented in TrackingViewStep.cpp +const NamedEnumTable< TrackingType >& trackingNames(); + #endif //TRACKINGTYPE_H diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index a51864ea9..2cb97f079 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -189,3 +189,20 @@ TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) m_widget->setGeneralPolicy( CalamaresUtils::getString( configurationMap, "policy" ) ); m_widget->setTrackingLevel( CalamaresUtils::getString( configurationMap, "default" ) ); } + +const NamedEnumTable< TrackingType >& +trackingNames() +{ + // *INDENT-OFF* + // clang-format off + static const NamedEnumTable< TrackingType > names { + { QStringLiteral( "none" ), TrackingType::NoTracking }, + { QStringLiteral( "install" ), TrackingType::InstallTracking }, + { QStringLiteral( "machine" ), TrackingType::MachineTracking }, + { QStringLiteral( "user" ), TrackingType::UserTracking } + }; + // clang-format on + // *INDENT-ON* + + return names; +} From fd2853b2cfa49d6af5add66ceaa75c60b0f97391 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 12 May 2020 11:41:02 +0200 Subject: [PATCH 02/63] [tracking] Switch setTrackingLevel() to use enum --- src/modules/tracking/TrackingPage.cpp | 34 ++++++++++------------- src/modules/tracking/TrackingPage.h | 14 ++++++---- src/modules/tracking/TrackingViewStep.cpp | 7 ++++- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index ba1d5efd0..359fac4b4 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -172,34 +172,28 @@ TrackingPage::setGeneralPolicy( QString url ) } void -TrackingPage::setTrackingLevel( const QString& l ) +TrackingPage::setTrackingLevel( TrackingType t ) { - QString level = l.toLower(); QRadioButton* button = nullptr; - if ( level.isEmpty() || level == "none" ) + switch( t ) { - button = ui->noneRadio; - } - else if ( level == "install" ) - { - button = ui->installRadio; - } - else if ( level == "machine" ) - { - button = ui->machineRadio; - } - else if ( level == "user" ) - { - button = ui->userRadio; + case TrackingType::NoTracking: + button = ui->noneRadio; + break; + case TrackingType::InstallTracking: + button = ui->installRadio; + break; + case TrackingType::MachineTracking: + button = ui->machineRadio; + break; + case TrackingType::UserTracking: + button = ui->userRadio; + break; } if ( button != nullptr ) { button->setChecked( true ); } - else - { - cWarning() << "unknown default tracking level" << l; - } } diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index 560115b92..52cfca493 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -35,7 +35,8 @@ class TrackingPage : public QWidget public: explicit TrackingPage( QWidget* parent = nullptr ); - /** + /** @brief Set initial state for each option + * * Enables or disables the tracking-option block for the given * tracking option @p t, and sets the initial state of the * checkbox to the @p user default. @@ -43,19 +44,20 @@ public: * Call this in ascending order of tracking type. */ void enableTrackingOption( TrackingType t, bool enabled ); - /** + /** @brief Is the given tracking type enabled? + * * Returns whether tracking type @p is selected by the user * (i.e. is the radio button for that level, or for a higher * tracking level, enabled). */ bool getTrackingOption( TrackingType t ); - /* URL for given level @p t */ + ///@brief Set URL for given level @p t void setTrackingPolicy( TrackingType t, QString url ); - /* URL for the global link */ + ///@brief Set URL for the global link void setGeneralPolicy( QString url ); - /* Select one of the four levels by name */ - void setTrackingLevel( const QString& level ); + ///@brief Select one of the four levels by name + void setTrackingLevel( TrackingType t ); private: Ui::TrackingPage* ui; diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 2cb97f079..f934301bd 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -187,7 +187,12 @@ TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) setTrackingOption( configurationMap, "user", TrackingType::UserTracking ); m_widget->setGeneralPolicy( CalamaresUtils::getString( configurationMap, "policy" ) ); - m_widget->setTrackingLevel( CalamaresUtils::getString( configurationMap, "default" ) ); + bool ok; + m_widget->setTrackingLevel( trackingNames().find(CalamaresUtils::getString( configurationMap, "default" ), ok ) ); + if ( !ok ) + { + cWarning() << "Default tracking level unknown:" << CalamaresUtils::getString( configurationMap, "default" ); + } } const NamedEnumTable< TrackingType >& From 8ed8b5dfa3e00274eb98dd4fa40274a1bbbfb82e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 12 May 2020 12:11:11 +0200 Subject: [PATCH 03/63] [tracking] Reduce compiler warnings - Newly added enum value NoTracking needs explicit handling in some switch()es, although it will never be passed in. --- src/modules/tracking/TrackingPage.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 359fac4b4..0ac466673 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -70,6 +70,9 @@ TrackingPage::enableTrackingOption( TrackingType t, bool enabled ) switch ( t ) { + case TrackingType::NoTracking: + // Nothing to do, this **has** no widget + return; case TrackingType::InstallTracking: group = ui->installGroup; break; @@ -108,6 +111,8 @@ TrackingPage::getTrackingOption( TrackingType t ) #define ch( x ) ui->x->isChecked() switch ( t ) { + case TrackingType::NoTracking: + return false; case TrackingType::InstallTracking: enabled = ch( installRadio ) || ch( machineRadio ) || ch( userRadio ); break; @@ -128,6 +133,9 @@ TrackingPage::setTrackingPolicy( TrackingType t, QString url ) QToolButton* button = nullptr; switch ( t ) { + case TrackingType::NoTracking: + cWarning() << "Cannot configure NoTracking widget"; + return; case TrackingType::InstallTracking: button = ui->installPolicyButton; break; From a69d47c115bcd32e9d4b8628b9ac939efb26d3fa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 12 May 2020 14:24:33 +0200 Subject: [PATCH 04/63] [tracking] Add a Config object --- src/modules/tracking/CMakeLists.txt | 1 + src/modules/tracking/Config.cpp | 40 +++++++++++++++++++++++++ src/modules/tracking/Config.h | 45 +++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/modules/tracking/Config.cpp create mode 100644 src/modules/tracking/Config.h diff --git a/src/modules/tracking/CMakeLists.txt b/src/modules/tracking/CMakeLists.txt index 24e020af4..11ccdb00b 100644 --- a/src/modules/tracking/CMakeLists.txt +++ b/src/modules/tracking/CMakeLists.txt @@ -2,6 +2,7 @@ calamares_add_plugin( tracking TYPE viewmodule EXPORT_MACRO PLUGINDLLEXPORT_PRO SOURCES + Config.cpp TrackingJobs.cpp TrackingPage.cpp TrackingViewStep.cpp diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp new file mode 100644 index 000000000..d920074fa --- /dev/null +++ b/src/modules/tracking/Config.cpp @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "Config.h" + +#include "utils/Logger.h" +#include "utils/Variant.h" + +Config::Config( QObject* parent ) + : QObject( parent ) +{ +} + +void +Config::setConfigurationMap( const QVariantMap& m ) +{ + m_generalPolicy = CalamaresUtils::getString( m, "policy" ); + emit generalPolicyChanged( m_generalPolicy ); +} + +QString +Config::generalPolicy() const +{ + return m_generalPolicy; +} diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h new file mode 100644 index 000000000..d0d6f6e0c --- /dev/null +++ b/src/modules/tracking/Config.h @@ -0,0 +1,45 @@ +/* === This file is part of Calamares - === + * + * Copyright 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef TRACKING_CONFIG_H +#define TRACKING_CONFIG_H + +#include +#include +#include + +class Config : public QObject +{ + Q_OBJECT + Q_PROPERTY( QString generalPolicy READ generalPolicy NOTIFY generalPolicyChanged FINAL ) + +public: + Config( QObject* parent = nullptr ); + void setConfigurationMap( const QVariantMap& ); + +public Q_SLOTS: + QString generalPolicy() const; + +signals: + void generalPolicyChanged( QString ); + +private: + QString m_generalPolicy; +}; + +#endif From 044f5ce2b56f97600d604353f4eef94bfdf7ac78 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 12 May 2020 14:39:42 +0200 Subject: [PATCH 05/63] [tracking] Use the config object - right now only holds the global policy URL (as a string) --- src/modules/tracking/TrackingPage.cpp | 75 +++++++++++++---------- src/modules/tracking/TrackingPage.h | 12 +++- src/modules/tracking/TrackingViewStep.cpp | 9 ++- src/modules/tracking/TrackingViewStep.h | 2 + 4 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 0ac466673..ae9a04843 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -18,6 +18,7 @@ #include "TrackingPage.h" +#include "Config.h" #include "ui_page_trackingstep.h" #include "Branding.h" @@ -32,27 +33,12 @@ #include #include -TrackingPage::TrackingPage( QWidget* parent ) +TrackingPage::TrackingPage( Config* config, QWidget* parent ) : QWidget( parent ) , ui( new Ui::TrackingPage ) { ui->setupUi( this ); - CALAMARES_RETRANSLATE( - QString product = Calamares::Branding::instance()->shortProductName(); ui->retranslateUi( this ); - ui->generalExplanation->setText( - tr( "Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with " - "the last two options below), get continuous information about preferred applications. To see what " - "will be sent, please click the help icon next to each area." ) - .arg( product ) ); - ui->installExplanation->setText( - tr( "By selecting this you will send information about your installation and hardware. This information " - "will only be sent once after the installation finishes." ) ); - ui->machineExplanation->setText( tr( "By selecting this you will periodically send information about " - "your installation, hardware and applications, to %1." ) - .arg( product ) ); - ui->userExplanation->setText( tr( "By selecting this you will regularly send information about your " - "installation, hardware, applications and usage patterns, to %1." ) - .arg( product ) ); ) + CALAMARES_RETRANSLATE_SLOT( &TrackingPage::retranslate ); QButtonGroup* group = new QButtonGroup( this ); group->setExclusive( true ); @@ -61,8 +47,33 @@ TrackingPage::TrackingPage( QWidget* parent ) group->addButton( ui->machineRadio ); group->addButton( ui->userRadio ); ui->noneRadio->setChecked( true ); + + connect( config, &Config::generalPolicyChanged, this, &TrackingPage::setGeneralPolicy ); + retranslate(); } +void +TrackingPage::retranslate() +{ + QString product = Calamares::Branding::instance()->shortProductName(); + ui->retranslateUi( this ); + ui->generalExplanation->setText( + tr( "Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with " + "the last two options below), get continuous information about preferred applications. To see what " + "will be sent, please click the help icon next to each area." ) + .arg( product ) ); + ui->installExplanation->setText( + tr( "By selecting this you will send information about your installation and hardware. This information " + "will only be sent once after the installation finishes." ) ); + ui->machineExplanation->setText( tr( "By selecting this you will periodically send information about " + "your installation, hardware and applications, to %1." ) + .arg( product ) ); + ui->userExplanation->setText( tr( "By selecting this you will regularly send information about your " + "installation, hardware, applications and usage patterns, to %1." ) + .arg( product ) ); +} + + void TrackingPage::enableTrackingOption( TrackingType t, bool enabled ) { @@ -154,7 +165,7 @@ TrackingPage::setTrackingPolicy( TrackingType t, QString url ) } else { - connect( button, &QToolButton::clicked, [ url ] { QDesktopServices::openUrl( url ); } ); + connect( button, &QToolButton::clicked, [url] { QDesktopServices::openUrl( url ); } ); cDebug() << "Tracking policy" << int( t ) << "set to" << url; } else @@ -175,7 +186,7 @@ TrackingPage::setGeneralPolicy( QString url ) ui->generalPolicyLabel->show(); ui->generalPolicyLabel->setTextInteractionFlags( Qt::TextBrowserInteraction ); ui->generalPolicyLabel->show(); - connect( ui->generalPolicyLabel, &QLabel::linkActivated, [ url ] { QDesktopServices::openUrl( url ); } ); + connect( ui->generalPolicyLabel, &QLabel::linkActivated, [url] { QDesktopServices::openUrl( url ); } ); } } @@ -184,20 +195,20 @@ TrackingPage::setTrackingLevel( TrackingType t ) { QRadioButton* button = nullptr; - switch( t ) + switch ( t ) { - case TrackingType::NoTracking: - button = ui->noneRadio; - break; - case TrackingType::InstallTracking: - button = ui->installRadio; - break; - case TrackingType::MachineTracking: - button = ui->machineRadio; - break; - case TrackingType::UserTracking: - button = ui->userRadio; - break; + case TrackingType::NoTracking: + button = ui->noneRadio; + break; + case TrackingType::InstallTracking: + button = ui->installRadio; + break; + case TrackingType::MachineTracking: + button = ui->machineRadio; + break; + case TrackingType::UserTracking: + button = ui->userRadio; + break; } if ( button != nullptr ) diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index 52cfca493..dbc9cc20c 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -29,11 +29,13 @@ namespace Ui class TrackingPage; } +class Config; + class TrackingPage : public QWidget { Q_OBJECT public: - explicit TrackingPage( QWidget* parent = nullptr ); + explicit TrackingPage( Config* config, QWidget* parent = nullptr ); /** @brief Set initial state for each option * @@ -54,11 +56,15 @@ public: ///@brief Set URL for given level @p t void setTrackingPolicy( TrackingType t, QString url ); - ///@brief Set URL for the global link - void setGeneralPolicy( QString url ); ///@brief Select one of the four levels by name void setTrackingLevel( TrackingType t ); +public Q_SLOTS: + ///@brief Set URL for the global link + void setGeneralPolicy( QString url ); + + void retranslate(); + private: Ui::TrackingPage* ui; }; diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index f934301bd..6da292242 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -18,6 +18,7 @@ #include "TrackingViewStep.h" +#include "Config.h" #include "TrackingJobs.h" #include "TrackingPage.h" @@ -43,7 +44,8 @@ isValidStyle( const QString& s ) TrackingViewStep::TrackingViewStep( QObject* parent ) : Calamares::ViewStep( parent ) - , m_widget( new TrackingPage ) + , m_config( new Config( this ) ) + , m_widget( new TrackingPage( m_config ) ) { emit nextStatusChanged( false ); } @@ -186,9 +188,10 @@ TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) setTrackingOption( configurationMap, "user", TrackingType::UserTracking ); - m_widget->setGeneralPolicy( CalamaresUtils::getString( configurationMap, "policy" ) ); + m_config->setConfigurationMap( configurationMap ); + bool ok; - m_widget->setTrackingLevel( trackingNames().find(CalamaresUtils::getString( configurationMap, "default" ), ok ) ); + m_widget->setTrackingLevel( trackingNames().find( CalamaresUtils::getString( configurationMap, "default" ), ok ) ); if ( !ok ) { cWarning() << "Default tracking level unknown:" << CalamaresUtils::getString( configurationMap, "default" ); diff --git a/src/modules/tracking/TrackingViewStep.h b/src/modules/tracking/TrackingViewStep.h index bb40d292a..a342dc498 100644 --- a/src/modules/tracking/TrackingViewStep.h +++ b/src/modules/tracking/TrackingViewStep.h @@ -29,6 +29,7 @@ #include #include +class Config; class TrackingPage; class PLUGINDLLEXPORT TrackingViewStep : public Calamares::ViewStep @@ -58,6 +59,7 @@ public: private: QVariantMap setTrackingOption( const QVariantMap& configurationMap, const QString& key, TrackingType t ); + Config* m_config; TrackingPage* m_widget; QString m_installTrackingUrl; QString m_machineTrackingStyle; From ed71b2fbf530af59dff51782dc7e37e6d25e0954 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 12 May 2020 14:42:04 +0200 Subject: [PATCH 06/63] [tracking] Only accept valid policy URLs --- src/modules/tracking/Config.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index d920074fa..67da7025d 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -21,6 +21,8 @@ #include "utils/Logger.h" #include "utils/Variant.h" +#include + Config::Config( QObject* parent ) : QObject( parent ) { @@ -30,6 +32,12 @@ void Config::setConfigurationMap( const QVariantMap& m ) { m_generalPolicy = CalamaresUtils::getString( m, "policy" ); + + if ( !QUrl( m_generalPolicy ).isValid() ) + { + m_generalPolicy = QString(); + } + emit generalPolicyChanged( m_generalPolicy ); } From da6f728cd45a17d759f3f3ef104b77182516c9b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Thu, 14 May 2020 12:30:58 -0400 Subject: [PATCH 07/63] [partition] Add support for partition uuid --- src/modules/partition/core/PartitionCoreModule.cpp | 1 + src/modules/partition/core/PartitionLayout.cpp | 6 ++++++ src/modules/partition/core/PartitionLayout.h | 2 ++ src/modules/partition/partition.conf | 1 + 4 files changed, 10 insertions(+) diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index aee1ab10f..b3c3409f4 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -883,6 +883,7 @@ PartitionCoreModule::initLayout( const QVariantList& config ) } if ( !m_partLayout->addEntry( CalamaresUtils::getString( pentry, "name" ), + CalamaresUtils::getString( pentry, "uuid" ), CalamaresUtils::getString( pentry, "type" ), CalamaresUtils::getString( pentry, "mountPoint" ), CalamaresUtils::getString( pentry, "filesystem" ), diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp index 33d2a7679..451604273 100644 --- a/src/modules/partition/core/PartitionLayout.cpp +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -118,6 +118,7 @@ PartitionLayout::addEntry( const QString& mountPoint, const QString& size, const bool PartitionLayout::addEntry( const QString& label, + const QString& uuid, const QString& type, const QString& mountPoint, const QString& fs, @@ -140,6 +141,7 @@ PartitionLayout::addEntry( const QString& label, } entry.partLabel = label; + entry.partUUID = uuid; entry.partType = type; entry.partMountPoint = mountPoint; PartUtils::findFS( fs, &entry.partFileSystem ); @@ -244,6 +246,10 @@ PartitionLayout::execute( Device* dev, currentPartition->setLabel( part.partLabel ); currentPartition->fileSystem().setLabel( part.partLabel ); } + if ( !part.partUUID.isEmpty() ) + { + currentPartition->setUUID( part.partUUID ); + } if ( !part.partType.isEmpty() ) { #if defined( WITH_KPMCORE42API ) diff --git a/src/modules/partition/core/PartitionLayout.h b/src/modules/partition/core/PartitionLayout.h index 5651ae995..a7bfcc4b9 100644 --- a/src/modules/partition/core/PartitionLayout.h +++ b/src/modules/partition/core/PartitionLayout.h @@ -41,6 +41,7 @@ public: struct PartitionEntry { QString partLabel; + QString partUUID; QString partType; QString partMountPoint; FileSystem::Type partFileSystem = FileSystem::Unknown; @@ -76,6 +77,7 @@ public: const QString& min = QString(), const QString& max = QString() ); bool addEntry( const QString& label, + const QString& uuid, const QString& type, const QString& mountPoint, const QString& fs, diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index f6cc34ee4..158258fc9 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -127,6 +127,7 @@ defaultFileSystemType: "ext4" # - name: filesystem label # and # partition name (gpt only; since KPMCore 4.2.0) +# - uuid: partition uuid (optional parameter; gpt only; requires KPMCore >= 4.2.0) # - type: partition type (optional parameter; gpt only; requires KPMCore >= 4.2.0) # - filesystem: filesystem type # - mountPoint: partition mount point From 3d2b9053b08b41ee9dab70c61a9542324442b35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Thu, 12 Mar 2020 15:27:35 -0400 Subject: [PATCH 08/63] [partition] Add the GPT label and UUID to global storage --- src/modules/partition/jobs/FillGlobalStorageJob.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp index 07c856d44..1242b7804 100644 --- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp +++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp @@ -91,6 +91,8 @@ mapForPartition( Partition* partition, const QString& uuid ) { QVariantMap map; map[ "device" ] = partition->partitionPath(); + map[ "partlabel" ] = partition->label(); + map[ "partuuid" ] = partition->uuid(); map[ "mountPoint" ] = PartitionInfo::mountPoint( partition ); map[ "fsName" ] = userVisibleFS( partition->fileSystem() ); map[ "fs" ] = untranslatedFS( partition->fileSystem() ); @@ -107,6 +109,7 @@ mapForPartition( Partition* partition, const QString& uuid ) Logger::CDebug deb; using TR = Logger::DebugRow< const char* const, const QString& >; deb << Logger::SubEntry << "mapping for" << partition->partitionPath() << partition->deviceNode() + << TR( "partlabel", map[ "partlabel" ].toString() ) << TR( "partuuid", map[ "partuuid" ].toString() ) << TR( "mountPoint:", PartitionInfo::mountPoint( partition ) ) << TR( "fs:", map[ "fs" ].toString() ) << TR( "fsName", map[ "fsName" ].toString() ) << TR( "uuid", uuid ) << TR( "claimed", map[ "claimed" ].toString() ); From d9fb9c19a80efd4f149b5952e868b2639a8e5034 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 18 May 2020 16:41:25 +0200 Subject: [PATCH 09/63] [tracking] Refactor the information for one tracking type - a single tracking type can be enabled for configuration in the config file; each must have a policy URL. Class TrackingStyleConfig is a base class for that kind of configuration. --- src/modules/tracking/Config.cpp | 58 +++++++++++++++++++++++++-- src/modules/tracking/Config.h | 70 +++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 67da7025d..217babba4 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -23,22 +23,72 @@ #include -Config::Config( QObject* parent ) +TrackingStyleConfig::TrackingStyleConfig( QObject* parent ) : QObject( parent ) { } +TrackingStyleConfig::~TrackingStyleConfig() { } + void -Config::setConfigurationMap( const QVariantMap& m ) +TrackingStyleConfig::setTracking( bool enabled ) { - m_generalPolicy = CalamaresUtils::getString( m, "policy" ); + setTracking( enabled ? EnabledByUser : DisabledByUser ); +} + +void +TrackingStyleConfig::setTracking( TrackingStyleConfig::TrackingState state ) +{ + if ( m_state != TrackingState::DisabledByConfig ) + { + m_state = state; + } + emit trackingChanged(); +} + +void +TrackingStyleConfig::setConfigurationMap( const QVariantMap& config ) +{ + m_state = CalamaresUtils::getBool( config, "enabled", false ) ? DisabledByUser : DisabledByConfig; + m_policy = CalamaresUtils::getString( config, "policy" ); + if ( !QUrl( m_policy ).isValid() ) + { + if ( m_state != DisabledByConfig ) + { + cError() << "Tracking policy URL" << m_policy << "is not valid; disabling this tracking type."; + } + m_policy = QString(); + m_state = DisabledByConfig; + } + + emit policyChanged( m_policy ); + emit trackingChanged(); +} + + +Config::Config( QObject* parent ) + : QObject( parent ) + , m_installTracking( new TrackingStyleConfig( this ) ) +{ +} + +void +Config::setConfigurationMap( const QVariantMap& configurationMap ) +{ + m_generalPolicy = CalamaresUtils::getString( configurationMap, "policy" ); if ( !QUrl( m_generalPolicy ).isValid() ) { m_generalPolicy = QString(); } - emit generalPolicyChanged( m_generalPolicy ); + + bool success = false; + auto subconfig = CalamaresUtils::getSubMap( configurationMap, "install", success ); + if ( success ) + { + m_installTracking->setConfigurationMap( subconfig ); + } } QString diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index d0d6f6e0c..80f6d74d1 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -23,10 +23,77 @@ #include #include +/** @brief Base class for configuring a specific kind of tracking. + * + * All tracking types have a policy URL, which is used to explain what + * kind of tracking is involved, what data is sent, etc. The content + * of that URL is the responsibility of the distro. + * + * A tracking type is disabled by default: if it isn't specifically + * enabled (for configuration) in the config file, it will always be disabled. + * If it is enabled (for configuration) in the config file, it still + * defaults to disabled, but the user can choose to enable it. + */ +class TrackingStyleConfig : public QObject +{ + Q_OBJECT + + Q_PROPERTY( TrackingState trackingStatus READ tracking WRITE setTracking NOTIFY trackingChanged FINAL ) + Q_PROPERTY( bool isEnabled READ isEnabled NOTIFY trackingChanged FINAL ) + Q_PROPERTY( bool isConfigurable READ isConfigurable NOTIFY trackingChanged FINAL ) + Q_PROPERTY( QString policy READ policy NOTIFY policyChanged FINAL ) + +public: + TrackingStyleConfig( QObject* parent ); + virtual ~TrackingStyleConfig(); + + void setConfigurationMap( const QVariantMap& ); + + enum TrackingState + { + DisabledByConfig, + DisabledByUser, + EnabledByUser + }; + Q_ENUM( TrackingState ); + +public Q_SLOTS: + TrackingState tracking() const { return m_state; } + /// @brief Has the user specifically enabled this kind of tracking? + bool isEnabled() const { return m_state == EnabledByUser; } + /// @brief Is this tracking enabled for configuration? + bool isConfigurable() const { return m_state != DisabledByConfig; } + /** @brief Sets the tracking state + * + * Unless the tracking is enabled for configuration, it always + * remains disabled. + */ + void setTracking( TrackingState ); + /** @brief Sets the tracking state + * + * Use @c true for @c EnabledByUser, @c false for DisabledByUser, + * but keep in mind that if the tracking is not enabled for + * configuration, it will always remain disabled. + */ + void setTracking( bool ); + + /// @brief URL for the policy explaining this tracking + QString policy() const { return m_policy; } + +signals: + void trackingChanged(); + void policyChanged( QString ); + +private: + TrackingState m_state = DisabledByConfig; + QString m_policy; // URL +}; + class Config : public QObject { Q_OBJECT Q_PROPERTY( QString generalPolicy READ generalPolicy NOTIFY generalPolicyChanged FINAL ) + Q_PROPERTY( TrackingStyleConfig* installTracking READ installTracking FINAL ) public: Config( QObject* parent = nullptr ); @@ -34,12 +101,15 @@ public: public Q_SLOTS: QString generalPolicy() const; + TrackingStyleConfig* installTracking() const { return m_installTracking; } signals: void generalPolicyChanged( QString ); private: QString m_generalPolicy; + + TrackingStyleConfig* m_installTracking; }; #endif From f97a0756a9af62ce544475d6631e93de2c9f012a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 18 May 2020 17:09:01 +0200 Subject: [PATCH 10/63] [tracking] Introduce configuration for install-tracking - subclass of TrackingStyleConfig holds the URL that is pinged with information when the installation is done. --- src/modules/tracking/Config.cpp | 43 ++++++++++++++++++++++++--------- src/modules/tracking/Config.h | 18 +++++++++++++- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 217babba4..7997556bf 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -46,29 +46,50 @@ TrackingStyleConfig::setTracking( TrackingStyleConfig::TrackingState state ) emit trackingChanged(); } +void +TrackingStyleConfig::validateUrl( QString& urlString ) +{ + if ( !QUrl( urlString ).isValid() ) + { + if ( m_state != DisabledByConfig ) + { + cError() << "URL" << urlString << "is not valid; disabling this tracking type."; + m_state = DisabledByConfig; + emit trackingChanged(); + } + urlString = QString(); + } +} + + void TrackingStyleConfig::setConfigurationMap( const QVariantMap& config ) { m_state = CalamaresUtils::getBool( config, "enabled", false ) ? DisabledByUser : DisabledByConfig; m_policy = CalamaresUtils::getString( config, "policy" ); - if ( !QUrl( m_policy ).isValid() ) - { - if ( m_state != DisabledByConfig ) - { - cError() << "Tracking policy URL" << m_policy << "is not valid; disabling this tracking type."; - } - m_policy = QString(); - m_state = DisabledByConfig; - } - + validateUrl( m_policy ); emit policyChanged( m_policy ); emit trackingChanged(); } +InstallTrackingConfig::InstallTrackingConfig( QObject* parent ) + : TrackingStyleConfig( parent ) +{ +} + +void +InstallTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap ) +{ + TrackingStyleConfig::setConfigurationMap( configurationMap ); + + m_installTrackingUrl = CalamaresUtils::getString( configurationMap, "url" ); + validateUrl( m_installTrackingUrl ); +} + Config::Config( QObject* parent ) : QObject( parent ) - , m_installTracking( new TrackingStyleConfig( this ) ) + , m_installTracking( new InstallTrackingConfig( this ) ) { } diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index 80f6d74d1..0fbf8495b 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -84,11 +84,27 @@ signals: void trackingChanged(); void policyChanged( QString ); +protected: + /// @brief Validates the @p urlString, disables tracking if invalid + void validateUrl( QString& urlString ); + private: TrackingState m_state = DisabledByConfig; QString m_policy; // URL }; +class InstallTrackingConfig : public TrackingStyleConfig +{ +public: + InstallTrackingConfig( QObject* parent ); + void setConfigurationMap( const QVariantMap& configurationMap ); + + QString installTrackingUrl() { return m_installTrackingUrl; } + +private: + QString m_installTrackingUrl; +}; + class Config : public QObject { Q_OBJECT @@ -109,7 +125,7 @@ signals: private: QString m_generalPolicy; - TrackingStyleConfig* m_installTracking; + InstallTrackingConfig* m_installTracking; }; #endif From 528b98c1c4410423958c776945ec012b7876a55a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 18 May 2020 17:42:51 +0200 Subject: [PATCH 11/63] [tracking] Configurations for machine and user tracking --- src/modules/tracking/Config.cpp | 59 +++++++++++++++++++++++++++++++++ src/modules/tracking/Config.h | 49 +++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 7997556bf..2c62447b1 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -46,6 +46,21 @@ TrackingStyleConfig::setTracking( TrackingStyleConfig::TrackingState state ) emit trackingChanged(); } +void +TrackingStyleConfig::validate( QString& s, std::function< bool( const QString& ) >&& pred ) +{ + if ( !pred( s ) ) + { + if ( m_state != DisabledByConfig ) + { + cError() << "Configuration string" << s << "is not valid; disabling this tracking type."; + m_state = DisabledByConfig; + emit trackingChanged(); + } + s = QString(); + } +} + void TrackingStyleConfig::validateUrl( QString& urlString ) { @@ -86,6 +101,50 @@ InstallTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap validateUrl( m_installTrackingUrl ); } +MachineTrackingConfig::MachineTrackingConfig( QObject* parent ) + : TrackingStyleConfig( parent ) +{ +} + +/** @brief Is @p s a valid machine-tracking style. */ +static bool +isValidMachineTrackingStyle( const QString& s ) +{ + static QStringList knownStyles { "neon" }; + return knownStyles.contains( s ); +} + +void +MachineTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap ) +{ + TrackingStyleConfig::setConfigurationMap( configurationMap ); + + m_machineTrackingStyle = CalamaresUtils::getString( configurationMap, "style" ); + validate( m_machineTrackingStyle, isValidMachineTrackingStyle ); +} + + +UserTrackingConfig::UserTrackingConfig( QObject* parent ) + : TrackingStyleConfig( parent ) +{ +} + +static bool +isValidUserTrackingStyle( const QString& s ) +{ + static QStringList knownStyles { "kde" }; + return knownStyles.contains( s ); +} + +void +UserTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap ) +{ + TrackingStyleConfig::setConfigurationMap( configurationMap ); + + m_userTrackingStyle = CalamaresUtils::getString( configurationMap, "style" ); + validate( m_userTrackingStyle, isValidUserTrackingStyle ); +} + Config::Config( QObject* parent ) : QObject( parent ) diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index 0fbf8495b..d9210b7ff 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -87,12 +87,21 @@ signals: protected: /// @brief Validates the @p urlString, disables tracking if invalid void validateUrl( QString& urlString ); + /// @brief Validates the @p string, disables tracking if invalid + void validate( QString& s, std::function< bool( const QString& s ) >&& pred ); private: TrackingState m_state = DisabledByConfig; QString m_policy; // URL }; +/** @brief Install tracking pings a URL at the end of installation + * + * Install tracking will do a single GET on the given URL at + * the end of installation. The information included in the GET + * request depends on the URL configuration, see also the tracking + * jobs. + */ class InstallTrackingConfig : public TrackingStyleConfig { public: @@ -105,6 +114,46 @@ private: QString m_installTrackingUrl; }; +/** @brief Machine tracking reports from the installed system + * + * When machine tracking is on, the installed system will report + * back ("call home") at some point. This can mean Debian pop-con, + * or KDE neon maching tracking, or something else. The kind + * of configuration depends on the style of tracking that is enabled. + */ +class MachineTrackingConfig : public TrackingStyleConfig +{ +public: + MachineTrackingConfig( QObject* parent ); + void setConfigurationMap( const QVariantMap& configurationMap ); + + QString machineTrackingStyle() { return m_machineTrackingStyle; } + +private: + QString m_machineTrackingStyle; +}; + +/** @brief User tracking reports user actions + * + * When user tracking is on, it is enabled for the user configured + * in Calamares -- not for users created afterwards in the target + * system, unless the target system defaults to tracking them. + * The kind of user tracking depends on the target system and + * environment; KDE user tracking is one example, which can be + * configured in a fine-grained way and defaults to off. + */ +class UserTrackingConfig : public TrackingStyleConfig +{ +public: + UserTrackingConfig( QObject* parent ); + void setConfigurationMap( const QVariantMap& configurationMap ); + + QString userTrackingStyle() { return m_userTrackingStyle; } + +private: + QString m_userTrackingStyle; +}; + class Config : public QObject { Q_OBJECT From 5763799ba9b6394a509c26a23831dda63c9a7700 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 18 May 2020 17:48:51 +0200 Subject: [PATCH 12/63] [tracking] Load all the tracking bits into the configuration --- src/modules/tracking/Config.cpp | 14 ++++++++++++++ src/modules/tracking/Config.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 2c62447b1..8b5decd76 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -149,6 +149,8 @@ UserTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap ) Config::Config( QObject* parent ) : QObject( parent ) , m_installTracking( new InstallTrackingConfig( this ) ) + , m_machineTracking( new MachineTrackingConfig( this ) ) + , m_userTracking( new UserTrackingConfig( this ) ) { } @@ -169,6 +171,18 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) { m_installTracking->setConfigurationMap( subconfig ); } + + subconfig = CalamaresUtils::getSubMap( configurationMap, "machine", success ); + if ( success ) + { + m_machineTracking->setConfigurationMap( subconfig ); + } + + subconfig = CalamaresUtils::getSubMap( configurationMap, "user", success ); + if ( success ) + { + m_userTracking->setConfigurationMap( subconfig ); + } } QString diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index d9210b7ff..1a451e5ce 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -175,6 +175,8 @@ private: QString m_generalPolicy; InstallTrackingConfig* m_installTracking; + MachineTrackingConfig* m_machineTracking; + UserTrackingConfig* m_userTracking; }; #endif From 309b2f872de99fb8d93ed54d531e71f798bf9157 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 18 May 2020 20:18:34 +0200 Subject: [PATCH 13/63] [tracking] Drop configuration fields from ViewStep - All the configuration lives in the Config object (or the tracking objects that it exposes). - Get data from the config object for the jobs; TODO: give the jobs a less-clunky interface. The UI isn't hooked up to the Config object yet, though. --- src/modules/tracking/Config.h | 7 ++- src/modules/tracking/TrackingViewStep.cpp | 62 +++++------------------ src/modules/tracking/TrackingViewStep.h | 35 ------------- 3 files changed, 19 insertions(+), 85 deletions(-) diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index 1a451e5ce..bd9ba520e 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -159,6 +159,8 @@ class Config : public QObject Q_OBJECT Q_PROPERTY( QString generalPolicy READ generalPolicy NOTIFY generalPolicyChanged FINAL ) Q_PROPERTY( TrackingStyleConfig* installTracking READ installTracking FINAL ) + Q_PROPERTY( TrackingStyleConfig* machineTracking READ machineTracking FINAL ) + Q_PROPERTY( TrackingStyleConfig* userTracking READ userTracking FINAL ) public: Config( QObject* parent = nullptr ); @@ -166,7 +168,10 @@ public: public Q_SLOTS: QString generalPolicy() const; - TrackingStyleConfig* installTracking() const { return m_installTracking; } + + InstallTrackingConfig* installTracking() const { return m_installTracking; } + MachineTrackingConfig* machineTracking() const { return m_machineTracking; } + UserTrackingConfig* userTracking() const { return m_userTracking; } signals: void generalPolicyChanged( QString ); diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 6da292242..98685bfc8 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -105,12 +105,9 @@ TrackingViewStep::isAtEnd() const void TrackingViewStep::onLeave() { - m_installTracking.userEnabled = m_widget->getTrackingOption( TrackingType::InstallTracking ); - m_machineTracking.userEnabled = m_widget->getTrackingOption( TrackingType::MachineTracking ); - m_userTracking.userEnabled = m_widget->getTrackingOption( TrackingType::UserTracking ); - cDebug() << "Install tracking:" << m_installTracking.enabled(); - cDebug() << "Machine tracking:" << m_machineTracking.enabled(); - cDebug() << " User tracking:" << m_userTracking.enabled(); + cDebug() << "Install tracking:" << m_config->installTracking()->isEnabled(); + cDebug() << "Machine tracking:" << m_config->machineTracking()->isEnabled(); + cDebug() << " User tracking:" << m_config->userTracking()->isEnabled(); } @@ -120,10 +117,10 @@ TrackingViewStep::jobs() const Calamares::JobList l; cDebug() << "Creating tracking jobs .."; - if ( m_installTracking.enabled() && !m_installTrackingUrl.isEmpty() ) + if ( m_config->installTracking()->isEnabled() ) { - QString installUrl = m_installTrackingUrl; - const auto s = CalamaresUtils::System::instance(); + QString installUrl = m_config->installTracking()->installTrackingUrl(); + const auto* s = CalamaresUtils::System::instance(); QString memory, disk; memory.setNum( s->getTotalMemoryB().first ); @@ -136,58 +133,25 @@ TrackingViewStep::jobs() const l.append( Calamares::job_ptr( new TrackingInstallJob( installUrl ) ) ); } - if ( m_machineTracking.enabled() && !m_machineTrackingStyle.isEmpty() ) + if ( m_config->machineTracking()->isEnabled() ) { - Q_ASSERT( isValidStyle( m_machineTrackingStyle ) ); - if ( m_machineTrackingStyle == "neon" ) + const auto style = m_config->machineTracking()->machineTrackingStyle(); + if ( style == "neon" ) { l.append( Calamares::job_ptr( new TrackingMachineNeonJob() ) ); } + else + { + cWarning() << "Unsupported machine tracking style" << style; + } } return l; } -QVariantMap -TrackingViewStep::setTrackingOption( const QVariantMap& configurationMap, const QString& key, TrackingType t ) -{ - bool settingEnabled = false; - - bool success = false; - auto config = CalamaresUtils::getSubMap( configurationMap, key, success ); - - if ( success ) - { - settingEnabled = CalamaresUtils::getBool( config, "enabled", false ); - } - - TrackingEnabled& trackingConfiguration = tracking( t ); - trackingConfiguration.settingEnabled = settingEnabled; - trackingConfiguration.userEnabled = false; - - m_widget->enableTrackingOption( t, settingEnabled ); - m_widget->setTrackingPolicy( t, CalamaresUtils::getString( config, "policy" ) ); - - return config; -} - void TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { - QVariantMap config; - - config = setTrackingOption( configurationMap, "install", TrackingType::InstallTracking ); - m_installTrackingUrl = CalamaresUtils::getString( config, "url" ); - - config = setTrackingOption( configurationMap, "machine", TrackingType::MachineTracking ); - auto s = CalamaresUtils::getString( config, "style" ); - if ( isValidStyle( s ) ) - { - m_machineTrackingStyle = s; - } - - setTrackingOption( configurationMap, "user", TrackingType::UserTracking ); - m_config->setConfigurationMap( configurationMap ); bool ok; diff --git a/src/modules/tracking/TrackingViewStep.h b/src/modules/tracking/TrackingViewStep.h index a342dc498..b05f1b053 100644 --- a/src/modules/tracking/TrackingViewStep.h +++ b/src/modules/tracking/TrackingViewStep.h @@ -57,43 +57,8 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ) override; private: - QVariantMap setTrackingOption( const QVariantMap& configurationMap, const QString& key, TrackingType t ); - Config* m_config; TrackingPage* m_widget; - QString m_installTrackingUrl; - QString m_machineTrackingStyle; - - struct TrackingEnabled - { - bool settingEnabled; // Enabled in config file - bool userEnabled; // User checked "yes" - - TrackingEnabled() - : settingEnabled( false ) - , userEnabled( false ) - { - } - - bool enabled() const { return settingEnabled && userEnabled; } - }; - TrackingEnabled m_installTracking, m_machineTracking, m_userTracking; - - inline TrackingEnabled& tracking( TrackingType t ) - { - if ( t == TrackingType::UserTracking ) - { - return m_userTracking; - } - else if ( t == TrackingType::MachineTracking ) - { - return m_machineTracking; - } - else - { - return m_installTracking; - } - } }; CALAMARES_PLUGIN_FACTORY_DECLARATION( TrackingViewStepFactory ) From 49e66b11a2938b92cd9647728de38058de921cd7 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 19 May 2020 10:42:25 +0200 Subject: [PATCH 14/63] [tracking] Refactor creation of jobs - Let the jobs handle their own styling and handling, simplify the ViewStep code. --- src/modules/tracking/TrackingJobs.cpp | 40 +++++++++++++++++++++ src/modules/tracking/TrackingJobs.h | 42 +++++++++++++++++++++-- src/modules/tracking/TrackingPage.cpp | 4 +-- src/modules/tracking/TrackingViewStep.cpp | 36 +++---------------- 4 files changed, 86 insertions(+), 36 deletions(-) diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 1f284e6dd..40af355bd 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -18,6 +18,8 @@ #include "TrackingJobs.h" +#include "Config.h" + #include "network/Manager.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" @@ -72,6 +74,44 @@ TrackingInstallJob::exec() return Calamares::JobResult::ok(); } +void +TrackingInstallJob::addJob( Calamares::JobList& list, InstallTrackingConfig* config ) +{ + if ( config->isEnabled() ) + { + QString installUrl = config->installTrackingUrl(); + const auto* s = CalamaresUtils::System::instance(); + + QString memory, disk; + memory.setNum( s->getTotalMemoryB().first ); + disk.setNum( s->getTotalDiskB() ); + + installUrl.replace( "$CPU", s->getCpuDescription() ).replace( "$MEMORY", memory ).replace( "$DISK", disk ); + + cDebug() << Logger::SubEntry << "install-tracking URL" << installUrl; + + list.append( Calamares::job_ptr( new TrackingInstallJob( installUrl ) ) ); + } +} + +void +TrackingMachineJob::addJob( Calamares::JobList& list, MachineTrackingConfig* config ) +{ + if ( config->isEnabled() ) + { + const auto style = config->machineTrackingStyle(); + if ( style == "neon" ) + { + list.append( Calamares::job_ptr( new TrackingMachineNeonJob() ) ); + } + else + { + cWarning() << "Unsupported machine tracking style" << style; + } + } +} + + QString TrackingMachineNeonJob::prettyName() const { diff --git a/src/modules/tracking/TrackingJobs.h b/src/modules/tracking/TrackingJobs.h index 813355591..c7c2450cb 100644 --- a/src/modules/tracking/TrackingJobs.h +++ b/src/modules/tracking/TrackingJobs.h @@ -16,13 +16,35 @@ * along with Calamares. If not, see . */ -#ifndef TRACKINGJOBS -#define TRACKINGJOBS +#ifndef TRACKING_TRACKINGJOBS_H +#define TRACKING_TRACKINGJOBS_H #include "Job.h" +class InstallTrackingConfig; +class MachineTrackingConfig; + class QSemaphore; +/** @section Tracking Jobs + * + * The tracking jobs do the actual work of configuring tracking on the + * target machine. Tracking jobs may have *styles*, variations depending + * on the distro or environment of the target system. At the root of + * each family of tracking jobs (installation, machine, user) there is + * a class with static method `addJob()` that takes the configuration + * information from the relevant Config sub-object and optionally + * adds the right job (subclass!) to the list of jobs. + */ + +/** @brief Install-tracking job (gets a URL) + * + * The install-tracking job (there is only one kind) does a GET + * on a configured URL with some additional information about + * the machine (if configured into the URL). + * + * No persistent tracking is done. + */ class TrackingInstallJob : public Calamares::Job { Q_OBJECT @@ -35,11 +57,25 @@ public: QString prettyStatusMessage() const override; Calamares::JobResult exec() override; + static void addJob( Calamares::JobList& list, InstallTrackingConfig* config ); + private: const QString m_url; }; -class TrackingMachineNeonJob : public Calamares::Job +/** @brief Base class for machine-tracking jobs + * + * Machine-tracking configuraiton depends on the distro / style of machine + * being tracked, so it has subclasses to switch on the relevant kind + * of tracking. A machine is tracked persistently. + */ +class TrackingMachineJob : public Calamares::Job +{ +public: + static void addJob( Calamares::JobList& list, MachineTrackingConfig* config ); +}; + +class TrackingMachineNeonJob : public TrackingMachineJob { Q_OBJECT public: diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index ae9a04843..7572ecb68 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -165,7 +165,7 @@ TrackingPage::setTrackingPolicy( TrackingType t, QString url ) } else { - connect( button, &QToolButton::clicked, [url] { QDesktopServices::openUrl( url ); } ); + connect( button, &QToolButton::clicked, [ url ] { QDesktopServices::openUrl( url ); } ); cDebug() << "Tracking policy" << int( t ) << "set to" << url; } else @@ -186,7 +186,7 @@ TrackingPage::setGeneralPolicy( QString url ) ui->generalPolicyLabel->show(); ui->generalPolicyLabel->setTextInteractionFlags( Qt::TextBrowserInteraction ); ui->generalPolicyLabel->show(); - connect( ui->generalPolicyLabel, &QLabel::linkActivated, [url] { QDesktopServices::openUrl( url ); } ); + connect( ui->generalPolicyLabel, &QLabel::linkActivated, [ url ] { QDesktopServices::openUrl( url ); } ); } } diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 98685bfc8..9942c2981 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -106,45 +106,19 @@ void TrackingViewStep::onLeave() { cDebug() << "Install tracking:" << m_config->installTracking()->isEnabled(); - cDebug() << "Machine tracking:" << m_config->machineTracking()->isEnabled(); - cDebug() << " User tracking:" << m_config->userTracking()->isEnabled(); + cDebug() << Logger::SubEntry << "Machine tracking:" << m_config->machineTracking()->isEnabled(); + cDebug() << Logger::SubEntry << " User tracking:" << m_config->userTracking()->isEnabled(); } Calamares::JobList TrackingViewStep::jobs() const { - Calamares::JobList l; - cDebug() << "Creating tracking jobs .."; - if ( m_config->installTracking()->isEnabled() ) - { - QString installUrl = m_config->installTracking()->installTrackingUrl(); - const auto* s = CalamaresUtils::System::instance(); - QString memory, disk; - memory.setNum( s->getTotalMemoryB().first ); - disk.setNum( s->getTotalDiskB() ); - - installUrl.replace( "$CPU", s->getCpuDescription() ).replace( "$MEMORY", memory ).replace( "$DISK", disk ); - - cDebug() << Logger::SubEntry << "install-tracking URL" << installUrl; - - l.append( Calamares::job_ptr( new TrackingInstallJob( installUrl ) ) ); - } - - if ( m_config->machineTracking()->isEnabled() ) - { - const auto style = m_config->machineTracking()->machineTrackingStyle(); - if ( style == "neon" ) - { - l.append( Calamares::job_ptr( new TrackingMachineNeonJob() ) ); - } - else - { - cWarning() << "Unsupported machine tracking style" << style; - } - } + Calamares::JobList l; + TrackingInstallJob::addJob( l, m_config->installTracking() ); + TrackingMachineJob::addJob( l, m_config->machineTracking() ); return l; } From dfd6bb6a8bf08dc8c83a228f43177917f8253972 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 19 May 2020 11:05:32 +0200 Subject: [PATCH 15/63] [tracking] Massage the displayed explanation --- src/modules/tracking/TrackingPage.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 7572ecb68..1e30a8a3a 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -58,19 +58,21 @@ TrackingPage::retranslate() QString product = Calamares::Branding::instance()->shortProductName(); ui->retranslateUi( this ); ui->generalExplanation->setText( - tr( "Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with " - "the last two options below), get continuous information about preferred applications. To see what " + tr( "Tracking helps %1 to see how often it is installed, what hardware it is installed on and " + "which applications are used. To see what " "will be sent, please click the help icon next to each area." ) .arg( product ) ); ui->installExplanation->setText( tr( "By selecting this you will send information about your installation and hardware. This information " "will only be sent once after the installation finishes." ) ); - ui->machineExplanation->setText( tr( "By selecting this you will periodically send information about " - "your installation, hardware and applications, to %1." ) - .arg( product ) ); - ui->userExplanation->setText( tr( "By selecting this you will regularly send information about your " - "installation, hardware, applications and usage patterns, to %1." ) - .arg( product ) ); + ui->machineExplanation->setText( + tr( "By selecting this you will periodically send information about your machine installation, " + "hardware and applications, to %1." ) + .arg( product ) ); + ui->userExplanation->setText( + tr( "By selecting this you will regularly send information about your " + "user installation, hardware, applications and application usage patterns, to %1." ) + .arg( product ) ); } From a7c4e2d203a05ef94b84f1451e4f4cc3a5728272 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 19 May 2020 11:12:16 +0200 Subject: [PATCH 16/63] [tracking] Remove widget-setting stuff not needed with Config --- src/modules/tracking/TrackingPage.cpp | 100 -------------------------- src/modules/tracking/TrackingPage.h | 19 ----- 2 files changed, 119 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 1e30a8a3a..82e0d99c5 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -76,106 +76,6 @@ TrackingPage::retranslate() } -void -TrackingPage::enableTrackingOption( TrackingType t, bool enabled ) -{ - QWidget* group = nullptr; - - switch ( t ) - { - case TrackingType::NoTracking: - // Nothing to do, this **has** no widget - return; - case TrackingType::InstallTracking: - group = ui->installGroup; - break; - case TrackingType::MachineTracking: - group = ui->machineGroup; - break; - case TrackingType::UserTracking: - group = ui->userGroup; - break; - } - - if ( group != nullptr ) - { - if ( enabled ) - { - group->show(); - } - else - { - group->hide(); - } - } - else - { - cWarning() << "unknown tracking option" << int( t ); - } -} - -bool -TrackingPage::getTrackingOption( TrackingType t ) -{ - bool enabled = false; - - // A tracking type is enabled if it is checked, or - // any higher level is checked. -#define ch( x ) ui->x->isChecked() - switch ( t ) - { - case TrackingType::NoTracking: - return false; - case TrackingType::InstallTracking: - enabled = ch( installRadio ) || ch( machineRadio ) || ch( userRadio ); - break; - case TrackingType::MachineTracking: - enabled = ch( machineRadio ) || ch( userRadio ); - break; - case TrackingType::UserTracking: - enabled = ch( userRadio ); - break; - } -#undef ch - return enabled; -} - -void -TrackingPage::setTrackingPolicy( TrackingType t, QString url ) -{ - QToolButton* button = nullptr; - switch ( t ) - { - case TrackingType::NoTracking: - cWarning() << "Cannot configure NoTracking widget"; - return; - case TrackingType::InstallTracking: - button = ui->installPolicyButton; - break; - case TrackingType::MachineTracking: - button = ui->machinePolicyButton; - break; - case TrackingType::UserTracking: - button = ui->userPolicyButton; - break; - } - - if ( button != nullptr ) - if ( url.isEmpty() ) - { - button->hide(); - } - else - { - connect( button, &QToolButton::clicked, [ url ] { QDesktopServices::openUrl( url ); } ); - cDebug() << "Tracking policy" << int( t ) << "set to" << url; - } - else - { - cWarning() << "unknown tracking option" << int( t ); - } -} - void TrackingPage::setGeneralPolicy( QString url ) { diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index dbc9cc20c..ce8b87729 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -37,25 +37,6 @@ class TrackingPage : public QWidget public: explicit TrackingPage( Config* config, QWidget* parent = nullptr ); - /** @brief Set initial state for each option - * - * Enables or disables the tracking-option block for the given - * tracking option @p t, and sets the initial state of the - * checkbox to the @p user default. - * - * Call this in ascending order of tracking type. - */ - void enableTrackingOption( TrackingType t, bool enabled ); - /** @brief Is the given tracking type enabled? - * - * Returns whether tracking type @p is selected by the user - * (i.e. is the radio button for that level, or for a higher - * tracking level, enabled). - */ - bool getTrackingOption( TrackingType t ); - - ///@brief Set URL for given level @p t - void setTrackingPolicy( TrackingType t, QString url ); ///@brief Select one of the four levels by name void setTrackingLevel( TrackingType t ); From 935f443a4db7085e27c44c2c061d4a5cf5881ca5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 25 May 2020 05:24:20 -0400 Subject: [PATCH 17/63] [tracking] Simplify policy display - Don't need an own slot for this, just connect to signals from Config and the label, neither of which need any state. --- src/modules/tracking/TrackingPage.cpp | 31 ++++++++++++--------------- src/modules/tracking/TrackingPage.h | 3 --- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 82e0d99c5..000ea2002 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -48,7 +48,20 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) group->addButton( ui->userRadio ); ui->noneRadio->setChecked( true ); - connect( config, &Config::generalPolicyChanged, this, &TrackingPage::setGeneralPolicy ); + // TODO: move to .ui file + ui->generalPolicyLabel->setTextInteractionFlags( Qt::TextBrowserInteraction ); + + connect( config, &Config::generalPolicyChanged, [ this ]( const QString& url ) { + this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); + } ); + connect( ui->generalPolicyLabel, &QLabel::linkActivated, [ config ] { + QString url( config->generalPolicy() ); + if ( !url.isEmpty() ) + { + QDesktopServices::openUrl( url ); + } + } ); + retranslate(); } @@ -76,22 +89,6 @@ TrackingPage::retranslate() } -void -TrackingPage::setGeneralPolicy( QString url ) -{ - if ( url.isEmpty() ) - { - ui->generalPolicyLabel->hide(); - } - else - { - ui->generalPolicyLabel->show(); - ui->generalPolicyLabel->setTextInteractionFlags( Qt::TextBrowserInteraction ); - ui->generalPolicyLabel->show(); - connect( ui->generalPolicyLabel, &QLabel::linkActivated, [ url ] { QDesktopServices::openUrl( url ); } ); - } -} - void TrackingPage::setTrackingLevel( TrackingType t ) { diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index ce8b87729..f63f7375c 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -41,9 +41,6 @@ public: void setTrackingLevel( TrackingType t ); public Q_SLOTS: - ///@brief Set URL for the global link - void setGeneralPolicy( QString url ); - void retranslate(); private: From 1d143d95a0ba544ff80c3738398ed29ed09bc8aa Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 25 May 2020 08:30:37 -0400 Subject: [PATCH 18/63] [tracking] Setup UI in the .ui file --- src/modules/tracking/TrackingPage.cpp | 3 --- src/modules/tracking/page_trackingstep.ui | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 000ea2002..02bc94195 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -48,9 +48,6 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) group->addButton( ui->userRadio ); ui->noneRadio->setChecked( true ); - // TODO: move to .ui file - ui->generalPolicyLabel->setTextInteractionFlags( Qt::TextBrowserInteraction ); - connect( config, &Config::generalPolicyChanged, [ this ]( const QString& url ) { this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); } ); diff --git a/src/modules/tracking/page_trackingstep.ui b/src/modules/tracking/page_trackingstep.ui index ae2ed11b8..9612ef2b4 100644 --- a/src/modules/tracking/page_trackingstep.ui +++ b/src/modules/tracking/page_trackingstep.ui @@ -279,6 +279,9 @@ margin-left: 2em; false + + Qt::TextBrowserInteraction + From bed884c9718a4a75bce1356cc33d4bee40c7892e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 25 May 2020 09:21:47 -0400 Subject: [PATCH 19/63] [tracking] Move setup of initial-tracking states to Config - the *default* level from the config, can be handled inside the Config object as well; remove TrackingPage method that does the same. --- src/modules/tracking/Config.cpp | 59 +++++++++++++++++++++++ src/modules/tracking/Config.h | 3 ++ src/modules/tracking/TrackingType.h | 2 +- src/modules/tracking/TrackingViewStep.cpp | 23 --------- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 8b5decd76..2dc91c2a9 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -18,11 +18,30 @@ #include "Config.h" +#include "TrackingType.h" + #include "utils/Logger.h" #include "utils/Variant.h" #include +const NamedEnumTable< TrackingType >& +trackingNames() +{ + // *INDENT-OFF* + // clang-format off + static const NamedEnumTable< TrackingType > names { + { QStringLiteral( "none" ), TrackingType::NoTracking }, + { QStringLiteral( "install" ), TrackingType::InstallTracking }, + { QStringLiteral( "machine" ), TrackingType::MachineTracking }, + { QStringLiteral( "user" ), TrackingType::UserTracking } + }; + // clang-format on + // *INDENT-ON* + + return names; +} + TrackingStyleConfig::TrackingStyleConfig( QObject* parent ) : QObject( parent ) { @@ -154,6 +173,26 @@ Config::Config( QObject* parent ) { } +static void +enableLevelsBelow( Config* config, TrackingType level ) +{ + switch( level ) + { + case TrackingType::UserTracking: + config->userTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); + FALLTHRU; + case TrackingType::MachineTracking: + config->machineTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); + FALLTHRU; + case TrackingType::InstallTracking: + config->installTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); + break; + case TrackingType::NoTracking: + config->noTracking( true ); + break; + } +} + void Config::setConfigurationMap( const QVariantMap& configurationMap ) { @@ -183,6 +222,14 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) { m_userTracking->setConfigurationMap( subconfig ); } + + auto level = trackingNames().find( CalamaresUtils::getString( configurationMap, "default" ), success ); + if ( !success ) + { + cWarning() << "Default tracking level unknown:" << CalamaresUtils::getString( configurationMap, "default" ); + level = TrackingType::NoTracking; + } + enableLevelsBelow( this, level ); } QString @@ -190,3 +237,15 @@ Config::generalPolicy() const { return m_generalPolicy; } + +void +Config::noTracking( bool switchOffAllTracking ) +{ + if ( !switchOffAllTracking ) + { + return; + } + m_installTracking->setTracking( TrackingStyleConfig::TrackingState::DisabledByUser ); + m_machineTracking->setTracking( TrackingStyleConfig::TrackingState::DisabledByUser ); + m_userTracking->setTracking( TrackingStyleConfig::TrackingState::DisabledByUser ); +} diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index bd9ba520e..26dcf2f4f 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -173,6 +173,9 @@ public Q_SLOTS: MachineTrackingConfig* machineTracking() const { return m_machineTracking; } UserTrackingConfig* userTracking() const { return m_userTracking; } + /// @brief Call with @c true to turn off all the trackings + void noTracking( bool ); + signals: void generalPolicyChanged( QString ); diff --git a/src/modules/tracking/TrackingType.h b/src/modules/tracking/TrackingType.h index 04e8d2ebe..22e3157d6 100644 --- a/src/modules/tracking/TrackingType.h +++ b/src/modules/tracking/TrackingType.h @@ -29,7 +29,7 @@ enum class TrackingType UserTracking // Track the user, ongoing }; -// Implemented in TrackingViewStep.cpp +// Implemented in Config.cpp const NamedEnumTable< TrackingType >& trackingNames(); #endif //TRACKINGTYPE_H diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 9942c2981..491fef12a 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -127,28 +127,5 @@ void TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { m_config->setConfigurationMap( configurationMap ); - - bool ok; - m_widget->setTrackingLevel( trackingNames().find( CalamaresUtils::getString( configurationMap, "default" ), ok ) ); - if ( !ok ) - { - cWarning() << "Default tracking level unknown:" << CalamaresUtils::getString( configurationMap, "default" ); - } } -const NamedEnumTable< TrackingType >& -trackingNames() -{ - // *INDENT-OFF* - // clang-format off - static const NamedEnumTable< TrackingType > names { - { QStringLiteral( "none" ), TrackingType::NoTracking }, - { QStringLiteral( "install" ), TrackingType::InstallTracking }, - { QStringLiteral( "machine" ), TrackingType::MachineTracking }, - { QStringLiteral( "user" ), TrackingType::UserTracking } - }; - // clang-format on - // *INDENT-ON* - - return names; -} From fab3ff2c41dbec28a0ee307c0c35d06738aff3fb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 25 May 2020 09:56:32 -0400 Subject: [PATCH 20/63] [tracking] Implement KUserFeedback configuration - write config files to turn on KUserFeedback (for known areas) - TODO: get the right home directory to write in --- src/modules/tracking/TrackingJobs.cpp | 69 +++++++++++++++++++++++++++ src/modules/tracking/TrackingJobs.h | 34 +++++++++++++ 2 files changed, 103 insertions(+) diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 40af355bd..18d01c7ca 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -162,3 +162,72 @@ true tr( "Could not configure machine feedback correctly, Calamares error %1." ).arg( r ) ); } } + +void +TrackingUserJob::addJob( Calamares::JobList& list, UserTrackingConfig* config ) +{ + if ( config->isEnabled() ) + { + const auto style = config->userTrackingStyle(); + if ( style == "kuserfeedback" ) + { + list.append( Calamares::job_ptr( new TrackingKUserFeedbackJob() ) ); + } + else + { + cWarning() << "Unsupported user tracking style" << style; + } + } +} + +QString +TrackingKUserFeedbackJob::prettyName() const +{ + return tr( "KDE user feedback" ); +} + +QString +TrackingKUserFeedbackJob::prettyDescription() const +{ + return prettyName(); +} + +QString +TrackingKUserFeedbackJob::prettyStatusMessage() const +{ + return tr( "Configuring KDE user feedback." ); +} + +Calamares::JobResult +TrackingKUserFeedbackJob::exec() +{ + // This is the contents of a config file to turn on some kind + // of KUserFeedback tracking; the level (16) is chosen for minimal + // but not zero tracking. + static const char config[] = R"x([Global] +FeedbackLevel=16 +)x"; + + for ( const QString& area : QStringList { "PlasmaUserFeedback" } ) + { + // TODO: get the configured user name + QString path = QStringLiteral( "/home/%1/.config/%2" ).arg( QString(), area ); + cDebug() << "Configuring KUserFeedback" << path; + + int r = CalamaresUtils::System::instance()->createTargetFile( path, config ); + if ( r > 0 ) + { + return Calamares::JobResult::error( + tr( "Error in KDE user feedback configuration." ), + tr( "Could not configure KDE user feedback correctly, script error %1." ).arg( r ) ); + } + else if ( r < 0 ) + { + return Calamares::JobResult::error( + tr( "Error in KDE user feedback configuration." ), + tr( "Could not configure KDE user feedback correctly, Calamares error %1." ).arg( r ) ); + } + } + + return Calamares::JobResult::ok(); +} diff --git a/src/modules/tracking/TrackingJobs.h b/src/modules/tracking/TrackingJobs.h index c7c2450cb..76e7dbed9 100644 --- a/src/modules/tracking/TrackingJobs.h +++ b/src/modules/tracking/TrackingJobs.h @@ -23,6 +23,7 @@ class InstallTrackingConfig; class MachineTrackingConfig; +class UserTrackingConfig; class QSemaphore; @@ -75,6 +76,12 @@ public: static void addJob( Calamares::JobList& list, MachineTrackingConfig* config ); }; +/** @brief Tracking machines, KDE neon style + * + * The machine has a machine-id, and this is sed(1)'ed into the + * update-manager configuration, to report the machine-id back + * to KDE neon servers. + */ class TrackingMachineNeonJob : public TrackingMachineJob { Q_OBJECT @@ -85,5 +92,32 @@ public: Calamares::JobResult exec() override; }; +/** @brief Base class for user-tracking jobs + * + * User-tracking configuration depends on the distro / style of user + * tracking being implemented, so there are subclasses to switch on the + * relevant kind of tracking. Users are tracked persistently (the user + * can of course configure the tracking again once the system is restarted). + */ +class TrackingUserJob : public Calamares::Job +{ +public: + static void addJob( Calamares::JobList& list, UserTrackingConfig* config ); +}; + +/** @brief Turn on KUserFeedback in target system + * + * This writes suitable files for turning on KUserFeedback for the + * normal user configured in Calamares. The feedback can be reconfigured + * by the user through Plasma's user-feedback dialog. + */ +class TrackingKUserFeedbackJob : public Calamares::Job +{ +public: + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; +}; #endif From 60e12174fd117e78d6984f28aafe6aa2a7a69fd9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 25 May 2020 10:32:56 -0400 Subject: [PATCH 21/63] [tracking] Switch out Radio for CheckBox - The Radio's are replaced by CheckBoxes and some logic, so that different tracking styles can be enabled independently. None of the settings end up in the Config yet, though. --- src/modules/tracking/TrackingPage.cpp | 67 +++++++++++++---------- src/modules/tracking/TrackingPage.h | 17 +++++- src/modules/tracking/page_trackingstep.ui | 8 +-- 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 02bc94195..e42ae2312 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -40,13 +40,15 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) ui->setupUi( this ); CALAMARES_RETRANSLATE_SLOT( &TrackingPage::retranslate ); - QButtonGroup* group = new QButtonGroup( this ); - group->setExclusive( true ); - group->addButton( ui->noneRadio ); - group->addButton( ui->installRadio ); - group->addButton( ui->machineRadio ); - group->addButton( ui->userRadio ); - ui->noneRadio->setChecked( true ); + ui->noneCheckBox->setChecked( true ); + connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::noneChecked ); + connect( ui->installCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::otherChecked ); + connect( ui->machineCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::otherChecked ); + connect( ui->userCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::otherChecked ); + + connect( ui->installCheckBox, &QCheckBox::stateChanged, [ this ]( int s ) { cDebug() << "Checkbox install changed" << s; } ); + connect( config->installTracking(), &TrackingStyleConfig::trackingChanged, [ config ]() { cDebug() << + "Install tracking changed" << config->installTracking()->isEnabled(); } ) ; connect( config, &Config::generalPolicyChanged, [ this ]( const QString& url ) { this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); @@ -85,30 +87,35 @@ TrackingPage::retranslate() .arg( product ) ); } - -void -TrackingPage::setTrackingLevel( TrackingType t ) +void TrackingPage::noneChecked(int state) { - QRadioButton* button = nullptr; - - switch ( t ) + if ( state ) { - case TrackingType::NoTracking: - button = ui->noneRadio; - break; - case TrackingType::InstallTracking: - button = ui->installRadio; - break; - case TrackingType::MachineTracking: - button = ui->machineRadio; - break; - case TrackingType::UserTracking: - button = ui->userRadio; - break; - } - - if ( button != nullptr ) - { - button->setChecked( true ); + cDebug() << "Unchecking all due to none box"; + ui->installCheckBox->setChecked( false ); + ui->machineCheckBox->setChecked( false ); + ui->userCheckBox->setChecked( false ); + } +} + +void TrackingPage::otherChecked(int state) +{ + cDebug() << "Other checked" << state; + if ( state ) + { + // Can't have none checked, if another one is + ui->noneCheckBox->setChecked( false ); + } + else + { + if ( ui->installCheckBox->isChecked() || ui->machineCheckBox->isChecked() || ui->userCheckBox->isChecked() ) + { + // One of them is still checked, leave *none* alone + ; + } + else + { + ui->noneCheckBox->setChecked( true ); + } } } diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index f63f7375c..e4c465fbc 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -37,12 +37,23 @@ class TrackingPage : public QWidget public: explicit TrackingPage( Config* config, QWidget* parent = nullptr ); - ///@brief Select one of the four levels by name - void setTrackingLevel( TrackingType t ); - public Q_SLOTS: void retranslate(); + /** @brief When the *no tracking* checkbox is changed + * + * @p state will be non-zero when the box is checked; this + * **unchecks** all the other boxes. + */ + void noneChecked( int state ); + + /** @brief Some other checkbox changed + * + * This may check the *none* button if all the others are + * now unchecked. + */ + void otherChecked( int state ); + private: Ui::TrackingPage* ui; }; diff --git a/src/modules/tracking/page_trackingstep.ui b/src/modules/tracking/page_trackingstep.ui index 9612ef2b4..4383d312d 100644 --- a/src/modules/tracking/page_trackingstep.ui +++ b/src/modules/tracking/page_trackingstep.ui @@ -32,7 +32,7 @@ margin-left: 2em; - + @@ -83,7 +83,7 @@ margin-left: 2em; - + @@ -145,7 +145,7 @@ margin-left: 2em; - + @@ -207,7 +207,7 @@ margin-left: 2em; - + From c1b5426c6630b34fb83a144984bf532a1b919d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Sat, 21 Mar 2020 14:21:16 -0400 Subject: [PATCH 22/63] [partition] Add support for partition attributes --- src/libcalamares/utils/Variant.cpp | 13 +++++++++++++ src/libcalamares/utils/Variant.h | 5 +++++ src/modules/partition/core/PartitionCoreModule.cpp | 1 + src/modules/partition/core/PartitionLayout.cpp | 10 ++++++++++ src/modules/partition/core/PartitionLayout.h | 2 ++ src/modules/partition/partition.conf | 2 ++ 6 files changed, 33 insertions(+) diff --git a/src/libcalamares/utils/Variant.cpp b/src/libcalamares/utils/Variant.cpp index cf6ff91fe..e0156c35e 100644 --- a/src/libcalamares/utils/Variant.cpp +++ b/src/libcalamares/utils/Variant.cpp @@ -85,6 +85,19 @@ getInteger( const QVariantMap& map, const QString& key, qint64 d ) return result; } +quint64 +getUnsignedInteger( const QVariantMap& map, const QString& key, quint64 u ) +{ + quint64 result = u; + if ( map.contains( key ) ) + { + auto v = map.value( key ); + result = v.toString().toULongLong(nullptr, 0); + } + + return result; +} + double getDouble( const QVariantMap& map, const QString& key, double d ) { diff --git a/src/libcalamares/utils/Variant.h b/src/libcalamares/utils/Variant.h index a05d281c3..8405f7659 100644 --- a/src/libcalamares/utils/Variant.h +++ b/src/libcalamares/utils/Variant.h @@ -48,6 +48,11 @@ DLLEXPORT QString getString( const QVariantMap& map, const QString& key ); */ DLLEXPORT qint64 getInteger( const QVariantMap& map, const QString& key, qint64 d ); +/** + * Get an unsigned integer value from a mapping; returns @p u if no value. + */ +DLLEXPORT quint64 getUnsignedInteger( const QVariantMap& map, const QString& key, quint64 u ); + /** * Get a double value from a mapping (integers are converted); returns @p d if no value. */ diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index aee1ab10f..5e0f8d363 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -884,6 +884,7 @@ PartitionCoreModule::initLayout( const QVariantList& config ) if ( !m_partLayout->addEntry( CalamaresUtils::getString( pentry, "name" ), CalamaresUtils::getString( pentry, "type" ), + CalamaresUtils::getUnsignedInteger( pentry, "attributes", 0 ), CalamaresUtils::getString( pentry, "mountPoint" ), CalamaresUtils::getString( pentry, "filesystem" ), CalamaresUtils::getSubMap( pentry, "features", ok ), diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp index 33d2a7679..2e573acd6 100644 --- a/src/modules/partition/core/PartitionLayout.cpp +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -119,6 +119,7 @@ PartitionLayout::addEntry( const QString& mountPoint, const QString& size, const bool PartitionLayout::addEntry( const QString& label, const QString& type, + quint64 attributes, const QString& mountPoint, const QString& fs, const QVariantMap& features, @@ -141,6 +142,7 @@ PartitionLayout::addEntry( const QString& label, entry.partLabel = label; entry.partType = type; + entry.partAttributes = attributes; entry.partMountPoint = mountPoint; PartUtils::findFS( fs, &entry.partFileSystem ); if ( entry.partFileSystem == FileSystem::Unknown ) @@ -250,6 +252,14 @@ PartitionLayout::execute( Device* dev, currentPartition->setType( part.partType ); #else cWarning() << "Ignoring type; requires KPMcore >= 4.2.0."; +#endif + } + if ( part.partAttributes ) + { +#if defined( WITH_KPMCORE42API ) + currentPartition->setAttributes( part.partAttributes ); +#else + cWarning() << "Ignoring attributes; requires KPMcore >= 4.2.0."; #endif } if ( !part.partFeatures.isEmpty() ) diff --git a/src/modules/partition/core/PartitionLayout.h b/src/modules/partition/core/PartitionLayout.h index 5651ae995..d7af5df0c 100644 --- a/src/modules/partition/core/PartitionLayout.h +++ b/src/modules/partition/core/PartitionLayout.h @@ -42,6 +42,7 @@ public: { QString partLabel; QString partType; + quint64 partAttributes; QString partMountPoint; FileSystem::Type partFileSystem = FileSystem::Unknown; QVariantMap partFeatures; @@ -77,6 +78,7 @@ public: const QString& max = QString() ); bool addEntry( const QString& label, const QString& type, + quint64 attributes, const QString& mountPoint, const QString& fs, const QVariantMap& features, diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf index f6cc34ee4..b04688138 100644 --- a/src/modules/partition/partition.conf +++ b/src/modules/partition/partition.conf @@ -106,6 +106,7 @@ defaultFileSystemType: "ext4" # size: 20% # minSize: 500M # maxSize: 10G +# attributes: 0xffff000000000003 # - name: "home" # type = "933ac7e1-2eb4-4f13-b844-0e14e2aef915" # filesystem: "ext4" @@ -128,6 +129,7 @@ defaultFileSystemType: "ext4" # and # partition name (gpt only; since KPMCore 4.2.0) # - type: partition type (optional parameter; gpt only; requires KPMCore >= 4.2.0) +# - attributes: partition attributes (optional parameter; gpt only; requires KPMCore >= 4.2.0) # - filesystem: filesystem type # - mountPoint: partition mount point # - size: partition size in bytes (append 'K', 'M' or 'G' for KiB, MiB or GiB) From 71249866df72be654a2456fbf1b0f452005bdec9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 12:45:29 +0200 Subject: [PATCH 23/63] CI: add tooling for schema validation The config files have fairly extensive documentation but no formal description; adding JSON-Schema into the mix makes it possible to write a machine-checkable description. --- ci/configvalidator.py | 110 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 ci/configvalidator.py diff --git a/ci/configvalidator.py b/ci/configvalidator.py new file mode 100644 index 000000000..e3b8ac24e --- /dev/null +++ b/ci/configvalidator.py @@ -0,0 +1,110 @@ +#! /usr/bin/env python3 +# +# SPDX-FileCopyrightText: 2020 Adriaan de Groot +# SPDX-License-Identifier: BSD-2-Clause +# License-Filename: LICENSES/BSD2 +# +usage = """ +Validates a Calamares config file -- YAML syntax -- against a schema. + +The schema is also written in YAML syntax, but the schema itself +is JSON-schema. This is possible because all JSON is YAML, and most +YAML is JSON. The limited subset of YAML that Calamares uses is +JSON-representable, anyway. + +Usage: + configvalidator.py ... +""" + +# The schemata originally lived outside the Calamares repository, +# without documented tooling. By putting them in the repository +# with the example files and explicit tooling, there's a better +# chance of them catching problems and acting as documentation. + +dependencies = """ +Dependencies for this tool are: py-yaml and py-jsonschema. + + https://pyyaml.org/ + https://github.com/Julian/jsonschema + +Simple installation is `pip install pyyaml jsonschema` +""" + +ERR_IMPORT, ERR_USAGE, ERR_FILE_NOT_FOUND, ERR_SYNTAX, ERR_INVALID = range(1,6) + +### DEPENDENCIES +# +# +try: + from jsonschema import validate, SchemaError, ValidationError + from yaml import safe_load, YAMLError +except ImportError as e: + print(e) + print(dependencies) + exit(ERR_IMPORT) + +from os.path import exists +import sys + +### INPUT VALIDATION +# +# +if len(sys.argv) < 3: + print(usage) + exit(ERR_USAGE) + +schema_file_name = sys.argv[1] +config_file_names = sys.argv[2:] + +if not exists(schema_file_name): + print(usage) + print("\nSchema file '{}' does not exist.".format(schema_file_name)) + exit(ERR_FILE_NOT_FOUND) +for f in config_file_names: + if not exists(f): + print(usage) + print("\nYAML file '{}' does not exist.".format(f)) + exit(ERR_FILE_NOT_FOUND) + +### FILES SYNTAX CHECK +# +# +with open(schema_file_name, "r") as data: + try: + schema = safe_load(data) + except YAMLError as e: + print("Schema error: {} {}.".format(e.problem, e.problem_mark)) + print("\nSchema file '{}' is invalid YAML.".format(schema_file_name)) + exit(ERR_SYNTAX) + +try: + validate(instance={}, schema=schema) +except SchemaError as e: + print(e.message) + print("\nSchema file '{}' is invalid JSON-Schema.".format(schema_file_name)) + exit(ERR_INVALID) +except ValidationError: + # Just means that empty isn't valid, but the Schema itself is + pass + +configs = [] +for f in config_file_names: + config = None + with open(f, "r") as data: + try: + config = safe_load(data) + except YAMLError as e: + print("YAML error: {} {}.".format(e.problem, e.problem_mark)) + print("\nYAML file '{}' is invalid.".format(f)) + exit(ERR_SYNTAX) + if config is None: + print("YAML file '{}' is empty.".format(f)) + configs.append(config) + +### SCHEMA VALIDATION +# +# +# Here a ValidationError from jsonschema carries a lot of useful information, +# so just let it go. +for c in configs: + validate(instance=c, schema=schema) From deec0b862fbb34aec8de96b2457a102d78c16805 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 13:04:34 +0200 Subject: [PATCH 24/63] [finished] Add schema for config - Original schema from artoo@manjaro.org, modified for current JSON-Schema use --- src/modules/finished/finished.schema.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/modules/finished/finished.schema.yaml diff --git a/src/modules/finished/finished.schema.yaml b/src/modules/finished/finished.schema.yaml new file mode 100644 index 000000000..56a844f50 --- /dev/null +++ b/src/modules/finished/finished.schema.yaml @@ -0,0 +1,11 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/finished +type: object +properties: + restartNowEnabled: { type: boolean, default: true } # TODO:3.3: remove + restartNowChecked: { type: boolean, default: false } # TODO:3.3: remove + restartNowCommand: { type: string } + restartNowMode: { type: string, enum: [ never, user-unchecked, user-checked, always ] } + notifyOnFinished: { type: boolean } +additionalProperties: false From 2e850f23e600a6fc745543da5b2e9d92a13ea594 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 13:12:22 +0200 Subject: [PATCH 25/63] Changes: thanks Phil, and change-of-branch --- CHANGES | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES b/CHANGES index b1b74f4ee..e53c59437 100644 --- a/CHANGES +++ b/CHANGES @@ -7,8 +7,11 @@ website will have to do for older versions. This release contains contributions from (alphabetically by first name): - Pablo Ovelleiro Corral + - Philip Müller ## Core ## + - The default branch for Calamares source repositories (calamares + and calamares-extensions) is now *calamares*. - External modules can now be built again, outside of the Calamares source and build-tree. From 62e7128ff616d0295e75cfbf8ce3f84a8e8b5bfb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 13:54:13 +0200 Subject: [PATCH 26/63] CMake: document WITH_ and BUILD_ a little more - also mark TODO:3.3: for incompatible / surprising changes for 3.3 --- CMakeLists.txt | 12 ++++++++---- src/modules/packagechooser/CMakeLists.txt | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 269b2e9b1..b643dbd51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,12 @@ # USE_ : fills in SKIP_MODULES for modules called - # WITH_ : try to enable (these usually default to ON). For # a list of WITH_ grep CMakeCache.txt after running -# CMake once. +# CMake once. These affect the ABI offered by Calamares. +# - PYTHON (enable Python Job modules) +# - QML (enable QML UI View modules) +# - PYTHONQT # TODO:3.3: remove # BUILD_ : choose additional things to build +# - TESTING (standard CMake option) # DEBUG_ : special developer flags for debugging # # Example usage: @@ -51,12 +55,12 @@ option( INSTALL_CONFIG "Install configuration files" OFF ) option( INSTALL_POLKIT "Install Polkit configuration" ON ) option( INSTALL_COMPLETION "Install shell completions" OFF ) # Options for the calamares executable -option( WITH_KF5Crash "Enable crash reporting with KCrash." ON ) -option( WITH_KF5DBus "Use DBus service for unique-application." OFF ) +option( WITH_KF5Crash "Enable crash reporting with KCrash." ON ) # TODO:3.3: WITH->BUILD (this isn't an ABI thing) +option( WITH_KF5DBus "Use DBus service for unique-application." OFF ) # TODO:3.3: WITH->BUILD # When adding WITH_* that affects the ABI offered by libcalamares, # also update libcalamares/CalamaresConfig.h.in option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) -option( WITH_PYTHONQT "Enable Python view modules API (deprecated, requires PythonQt)." OFF ) +option( WITH_PYTHONQT "Enable Python view modules API (deprecated, requires PythonQt)." OFF ) # TODO:3.3: remove option( WITH_QML "Enable QML UI options." ON ) # Possible debugging flags are: diff --git a/src/modules/packagechooser/CMakeLists.txt b/src/modules/packagechooser/CMakeLists.txt index d85eda8e2..d949829de 100644 --- a/src/modules/packagechooser/CMakeLists.txt +++ b/src/modules/packagechooser/CMakeLists.txt @@ -5,6 +5,7 @@ set( _extra_src "" ) ### OPTIONAL AppData XML support in PackageModel # # +# TODO:3.3:WITH->BUILD (this doesn't affect the ABI offered by Calamares) option( WITH_APPDATA "Support appdata: items in PackageChooser (requires QtXml)" ON ) if ( WITH_APPDATA ) find_package(Qt5 COMPONENTS Xml) From 0dbc44d3887c237c800e9e274ff9870fe1989566 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 14:06:26 +0200 Subject: [PATCH 27/63] CMake: update Python3-finding - mark for updates in 3.3: update to CMake 3.12 and use the more-modern Python modules for it then. --- CMakeLists.txt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b643dbd51..4506e9f6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ # One special target is "show-version", which can be built # to obtain the version number from here. +# TODO:3.3: Require CMake 3.12 cmake_minimum_required( VERSION 3.3 FATAL_ERROR ) project( CALAMARES VERSION 3.2.26 @@ -326,15 +327,27 @@ if( NOT KF5DBusAddons_FOUND ) set( WITH_KF5DBus OFF ) endif() +# TODO:3.3: Use FindPython3 instead +find_package( PythonInterp ${PYTHONLIBS_VERSION} ) +set_package_properties( + PythonInterp PROPERTIES + DESCRIPTION "Python 3 interpreter." + URL "https://python.org" + PURPOSE "Python 3 interpreter for certain tests." +) +if ( PYTHONINTERP_FOUND ) + message(STATUS "Found Python 3 interpreter ${PYTHON_EXECUTABLE}") +endif() find_package( PythonLibs ${PYTHONLIBS_VERSION} ) set_package_properties( PythonLibs PROPERTIES DESCRIPTION "C interface libraries for the Python 3 interpreter." - URL "http://python.org" + URL "https://python.org" PURPOSE "Python 3 is used for Python job modules." ) if ( PYTHONLIBS_FOUND ) + # TODO:3.3: Require Boost + CMake; sort out Boost::Python # Since Boost provides CMake config files (starting with Boost 1.70. # or so) the mess that is the Calamares find code picks the wrong # bits. Suppress those CMake config files, as suggested by @jmrcpn @@ -345,7 +358,7 @@ if ( PYTHONLIBS_FOUND ) Boost PROPERTIES PURPOSE "Boost.Python is used for Python job modules." ) - + # TODO:3.3: Remove PythonQt support find_package( PythonQt ) set_package_properties( PythonQt PROPERTIES DESCRIPTION "A Python embedding solution for Qt applications." From b48c2745c149a608a9c3dc47ec6c0e18b660cb11 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 14:38:13 +0200 Subject: [PATCH 28/63] CI: apply schema-validation to the example config files - Any config file with a schema gets a test (validate-) to test the file. --- src/modules/CMakeLists.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt index 533c704f8..0b81c4b3f 100644 --- a/src/modules/CMakeLists.txt +++ b/src/modules/CMakeLists.txt @@ -66,3 +66,21 @@ endforeach() include( CalamaresAddTranslations ) add_calamares_python_translations( ${CALAMARES_TRANSLATION_LANGUAGES} ) + +# TODO:3.3: Use FindPython3 +if ( BUILD_TESTING AND PYTHONINTERP_FOUND AND PYTHON_EXECUTABLE ) + # The tests for each config file are independent of whether the + # module is enabled or not: the config file should match its schema + # regardless. + foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) + set( _schema_file "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/${SUBDIRECTORY}.schema.yaml" ) + set( _conf_file "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/${SUBDIRECTORY}.conf" ) + if ( EXISTS "${_schema_file}" AND EXISTS "${_conf_file}" ) + add_test( + NAME validate-${SUBDIRECTORY} + COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/ci/configvalidator.py" "${_schema_file}" "${_conf_file}" + ) + endif() + endforeach() +endif() + From a0d56acabee57a845c004483baf944a578c18fbc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 15:37:19 +0200 Subject: [PATCH 29/63] CI: verbose schema-failure diagnostics --- ci/configvalidator.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ci/configvalidator.py b/ci/configvalidator.py index e3b8ac24e..858c53224 100644 --- a/ci/configvalidator.py +++ b/ci/configvalidator.py @@ -79,8 +79,9 @@ with open(schema_file_name, "r") as data: try: validate(instance={}, schema=schema) +# While developing the schemata, get full exceptions from schema failure except SchemaError as e: - print(e.message) + print(e) print("\nSchema file '{}' is invalid JSON-Schema.".format(schema_file_name)) exit(ERR_INVALID) except ValidationError: @@ -101,10 +102,15 @@ for f in config_file_names: print("YAML file '{}' is empty.".format(f)) configs.append(config) +assert len(configs) == len(config_file_names), "Not all configurations loaded." + ### SCHEMA VALIDATION # # -# Here a ValidationError from jsonschema carries a lot of useful information, -# so just let it go. -for c in configs: - validate(instance=c, schema=schema) +for c, f in zip(configs, config_file_names): + try: + validate(instance=c, schema=schema) + except ValidationError as e: + print(e) + print("\nConfig file '{}' does not validate in schema.".format(f)) + exit(ERR_INVALID) From df183d40269e63bc8406ee7e2df7d9ce24795583 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 16:03:28 +0200 Subject: [PATCH 30/63] [welcome] Add schema for welcome config - Note that this is missing *languageIcon* so if that gets uncommented, it will fail validation. - While here decide that should be right up front in object (mappings) declaration. --- src/modules/finished/finished.schema.yaml | 2 +- src/modules/welcome/welcome.schema.yaml | 36 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/modules/welcome/welcome.schema.yaml diff --git a/src/modules/finished/finished.schema.yaml b/src/modules/finished/finished.schema.yaml index 56a844f50..53189c7fa 100644 --- a/src/modules/finished/finished.schema.yaml +++ b/src/modules/finished/finished.schema.yaml @@ -1,6 +1,7 @@ --- $schema: https://json-schema.org/schema# $id: https://calamares.io/schemas/finished +additionalProperties: false type: object properties: restartNowEnabled: { type: boolean, default: true } # TODO:3.3: remove @@ -8,4 +9,3 @@ properties: restartNowCommand: { type: string } restartNowMode: { type: string, enum: [ never, user-unchecked, user-checked, always ] } notifyOnFinished: { type: boolean } -additionalProperties: false diff --git a/src/modules/welcome/welcome.schema.yaml b/src/modules/welcome/welcome.schema.yaml new file mode 100644 index 000000000..56a79be06 --- /dev/null +++ b/src/modules/welcome/welcome.schema.yaml @@ -0,0 +1,36 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/welcome +additionalProperties: false +type: object +properties: + # TODO:3.3: drop the string alternatives and put the URL part in Branding + showSupportUrl: { anyOf: [ { type: boolean, default: true }, { type: string } ] } + showKnownIssuesUrl: { anyOf: [ { type: boolean, default: true }, { type: string } ] } + showReleaseNotesUrl: { anyOf: [ { type: boolean, default: true }, { type: string } ] } + showDonateUrl: { anyOf: [ { type: boolean, default: true }, { type: string } ] } + + requirements: + additionalProperties: false + type: object + properties: + requiredStorage: { type: number } + requiredRam: { type: number } + internetCheckUrl: { type: string } + check: + type: array + items: { type: string, enum: [storage, ram, power, internet, root, screen], unique: true } + required: # Key-name in the config-file + type: array + items: { type: string, enum: [storage, ram, power, internet, root, screen], unique: true } + required: [ requiredStorage, requiredRam, check ] # Schema keyword + + # TODO: refactor, this is reused in locale + geoip: + additionalProperties: false + type: object + properties: + style: { type: string, enum: [ none, fixed, xml, json ] } + url: { type: string } + selector: { type: string } + required: [ style, url, selector ] From 4a07bd4ae3ad297b48ee520f099434fa456e88bb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 16:06:56 +0200 Subject: [PATCH 31/63] CI: import all the rest of the YAML schema - These have **not** been fixed for validation, so the schema's themselves will fail to load. This is a consequence of variations in JSON-Schema representations through various drafts. Fixing the schemata is fairly straightforward. This gives us 19 new tests, all of which fail. --- src/modules/bootloader/bootloader.schema.yaml | 18 ++++++++++ .../displaymanager/displaymanager.schema.yaml | 16 +++++++++ src/modules/fstab/fstab.schema.yaml | 19 +++++++++++ src/modules/grubcfg/grubcfg.schema.yaml | 15 +++++++++ src/modules/initcpio/initcpio.schema.yaml | 7 ++++ src/modules/keyboard/keyboard.schema.yaml | 8 +++++ src/modules/license/license.schema.yaml | 17 ++++++++++ src/modules/locale/locale.schema.yaml | 10 ++++++ .../luksopenswaphookcfg.schema.yaml | 7 ++++ src/modules/machineid/machineid.schema.yaml | 9 +++++ src/modules/mount/mount.schema.yaml | 24 ++++++++++++++ src/modules/netinstall/netinstall.schema.yaml | 7 ++++ src/modules/packages/packages.schema.yaml | 33 +++++++++++++++++++ src/modules/partition/partition.schema.yaml | 11 +++++++ .../plymouthcfg/plymouthcfg.schema.yaml | 7 ++++ src/modules/removeuser/removeuser.schema.yaml | 7 ++++ src/modules/umount/umount.schema.yaml | 8 +++++ src/modules/unpackfs/unpackfs.schema.yaml | 14 ++++++++ src/modules/users/users.schema.yaml | 18 ++++++++++ 19 files changed, 255 insertions(+) create mode 100644 src/modules/bootloader/bootloader.schema.yaml create mode 100644 src/modules/displaymanager/displaymanager.schema.yaml create mode 100644 src/modules/fstab/fstab.schema.yaml create mode 100644 src/modules/grubcfg/grubcfg.schema.yaml create mode 100644 src/modules/initcpio/initcpio.schema.yaml create mode 100644 src/modules/keyboard/keyboard.schema.yaml create mode 100644 src/modules/license/license.schema.yaml create mode 100644 src/modules/locale/locale.schema.yaml create mode 100644 src/modules/luksopenswaphookcfg/luksopenswaphookcfg.schema.yaml create mode 100644 src/modules/machineid/machineid.schema.yaml create mode 100644 src/modules/mount/mount.schema.yaml create mode 100644 src/modules/netinstall/netinstall.schema.yaml create mode 100644 src/modules/packages/packages.schema.yaml create mode 100644 src/modules/partition/partition.schema.yaml create mode 100644 src/modules/plymouthcfg/plymouthcfg.schema.yaml create mode 100644 src/modules/removeuser/removeuser.schema.yaml create mode 100644 src/modules/umount/umount.schema.yaml create mode 100644 src/modules/unpackfs/unpackfs.schema.yaml create mode 100644 src/modules/users/users.schema.yaml diff --git a/src/modules/bootloader/bootloader.schema.yaml b/src/modules/bootloader/bootloader.schema.yaml new file mode 100644 index 000000000..45e8d4996 --- /dev/null +++ b/src/modules/bootloader/bootloader.schema.yaml @@ -0,0 +1,18 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/bootloader +additionalProperties: false +type: object +properties: + efiBootLoader: { type: string, required: true } + kernel: { type: string, required: true } + img: { type: string, required: true } + fallback: { type: str } + timeout: { type: str } + bootloaderEntryName: { type: str } + kernelLine: { type: str } + fallbackKernelLine: { type: str } + grubInstall: { type: string, required: true } + grubMkconfig: { type: string, required: true } + grubCfg: { type: string, required: true } + efiBootloaderId: { type: str } diff --git a/src/modules/displaymanager/displaymanager.schema.yaml b/src/modules/displaymanager/displaymanager.schema.yaml new file mode 100644 index 000000000..a16af732f --- /dev/null +++ b/src/modules/displaymanager/displaymanager.schema.yaml @@ -0,0 +1,16 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/displaymanager +additionalProperties: false +type: object +properties: + "displaymanagers": + type: seq + sequence: + - { type: string, required: true, enum: [slim, sddm, lightdm, gdm, mdm, lxdm, kdm] } + "defaultDesktopEnvironment": + type: map + mapping: + "executable": { type: str } + "desktopFile": { type: str } + "basicSetup": { type: boolean, default: false } diff --git a/src/modules/fstab/fstab.schema.yaml b/src/modules/fstab/fstab.schema.yaml new file mode 100644 index 000000000..1c2bf459c --- /dev/null +++ b/src/modules/fstab/fstab.schema.yaml @@ -0,0 +1,19 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/fstab +additionalProperties: false +type: object +properties: + "mountOptions": + type: map + mapping: + "default": { type: string, required: true } + "btrfs": { type: string, required: true } + "ssdExtraMountOptions": + type: map + mapping: + "ext4": { type: string, required: true } + "jfs": { type: string, required: true } + "xfs": { type: string, required: true } + "swap": { type: string, required: true } + "btrfs": { type: string, required: true } diff --git a/src/modules/grubcfg/grubcfg.schema.yaml b/src/modules/grubcfg/grubcfg.schema.yaml new file mode 100644 index 000000000..10aa34c2b --- /dev/null +++ b/src/modules/grubcfg/grubcfg.schema.yaml @@ -0,0 +1,15 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/grubcfg +additionalProperties: false +type: object +properties: + "overwrite": { type: boolean, default: false } + "defaults": + type: map + mapping: + "GRUB_TIMEOUT": { type: int, required: true } + "GRUB_DEFAULT": { type: string, required: true } + "GRUB_DISABLE_SUBMENU": { type: boolean, default: true } + "GRUB_TERMINAL_OUTPUT": { type: string, required: true } + "GRUB_DISABLE_RECOVERY": { type: boolean, default: true } diff --git a/src/modules/initcpio/initcpio.schema.yaml b/src/modules/initcpio/initcpio.schema.yaml new file mode 100644 index 000000000..db81ba68e --- /dev/null +++ b/src/modules/initcpio/initcpio.schema.yaml @@ -0,0 +1,7 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/initcpio +additionalProperties: false +type: object +properties: + kernel: { type: string, required: true } diff --git a/src/modules/keyboard/keyboard.schema.yaml b/src/modules/keyboard/keyboard.schema.yaml new file mode 100644 index 000000000..33175b84d --- /dev/null +++ b/src/modules/keyboard/keyboard.schema.yaml @@ -0,0 +1,8 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/finished +additionalProperties: keyboard +type: object +properties: + xOrgConfFileName: { type: string, required: true } + convertedKeymapPath: { type: string, required: true } diff --git a/src/modules/license/license.schema.yaml b/src/modules/license/license.schema.yaml new file mode 100644 index 000000000..62bd07035 --- /dev/null +++ b/src/modules/license/license.schema.yaml @@ -0,0 +1,17 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/license +additionalProperties: false +type: object +properties: + "entries": + type: seq + sequence: + - type: map + mapping: + "id": { type: str } + "name": { type: str } + "vendor": { type: str } + "type": { type: str } + "url": { type: str } + "required": { type: boolean, default: false } diff --git a/src/modules/locale/locale.schema.yaml b/src/modules/locale/locale.schema.yaml new file mode 100644 index 000000000..41c3ad487 --- /dev/null +++ b/src/modules/locale/locale.schema.yaml @@ -0,0 +1,10 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/locale +additionalProperties: false +type: object +properties: + "region": { type: str } + "zone": { type: str } + "localeGenPath": { type: string, required: true } + "geoipUrl": { type: str } diff --git a/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.schema.yaml b/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.schema.yaml new file mode 100644 index 000000000..660e06d0b --- /dev/null +++ b/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.schema.yaml @@ -0,0 +1,7 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/luksopenswaphookcfg +additionalProperties: false +type: object +properties: + "configFilePath": { type: string, required: true } diff --git a/src/modules/machineid/machineid.schema.yaml b/src/modules/machineid/machineid.schema.yaml new file mode 100644 index 000000000..588a7fa4e --- /dev/null +++ b/src/modules/machineid/machineid.schema.yaml @@ -0,0 +1,9 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/machineid +additionalProperties: false +type: object +properties: + "systemd": { type: boolean, default: true } + "dbus": { type: boolean, default: true } + "symlink": { type: boolean, default: true } diff --git a/src/modules/mount/mount.schema.yaml b/src/modules/mount/mount.schema.yaml new file mode 100644 index 000000000..8a81d9462 --- /dev/null +++ b/src/modules/mount/mount.schema.yaml @@ -0,0 +1,24 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/mount +additionalProperties: false +type: object +properties: + "extraMounts": + type: seq + sequence: + - type: map + mapping: + "device": { type: string, required: true } + "fs": { type: str } + "mountPoint": { type: string, required: true } + "options": { type: str } + "extraMountsEfi": + type: seq + sequence: + - type: map + mapping: + "device": { type: string, required: true } + "fs": { type: str } + "mountPoint": { type: string, required: true } + "options": { type: str } diff --git a/src/modules/netinstall/netinstall.schema.yaml b/src/modules/netinstall/netinstall.schema.yaml new file mode 100644 index 000000000..8420ea501 --- /dev/null +++ b/src/modules/netinstall/netinstall.schema.yaml @@ -0,0 +1,7 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/netinstall +additionalProperties: false +type: object +properties: + groupsUrl: { type: string, required: true } diff --git a/src/modules/packages/packages.schema.yaml b/src/modules/packages/packages.schema.yaml new file mode 100644 index 000000000..8b8a9eb1d --- /dev/null +++ b/src/modules/packages/packages.schema.yaml @@ -0,0 +1,33 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/packages +additionalProperties: false +type: object +properties: + "backend": { type: string, required: true, enum: [packagekit, zypp, yum, dnf, urpmi, apt, pacman, portage, entropy] } + "update_db": { type: boolean, default: true } + "operations": + type: seq + sequence: + - type: map + mapping: + "install": + type: seq + sequence: + - { type: text } + "remove": + type: seq + sequence: + - { type: text } + "localInstall": + type: seq + sequence: + - { type: text } + "try_install": + type: seq + sequence: + - { type: text } + "try_remove": + type: seq + sequence: + - { type: text } diff --git a/src/modules/partition/partition.schema.yaml b/src/modules/partition/partition.schema.yaml new file mode 100644 index 000000000..198123dd5 --- /dev/null +++ b/src/modules/partition/partition.schema.yaml @@ -0,0 +1,11 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/partition +additionalProperties: false +type: object +properties: + efiSystemPartition: { type: string, required: true } + ensureSuspendToDisk: { type: boolean, default: true } + drawNestedPartitions: { type: boolean, default: false } + alwaysShowPartitionLabels: { type: boolean, default: true } + defaultFileSystemType: { type: string, required: true } diff --git a/src/modules/plymouthcfg/plymouthcfg.schema.yaml b/src/modules/plymouthcfg/plymouthcfg.schema.yaml new file mode 100644 index 000000000..b15db1527 --- /dev/null +++ b/src/modules/plymouthcfg/plymouthcfg.schema.yaml @@ -0,0 +1,7 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/plymouthcfg +additionalProperties: false +type: object +properties: + plymouth_theme: { type: str } diff --git a/src/modules/removeuser/removeuser.schema.yaml b/src/modules/removeuser/removeuser.schema.yaml new file mode 100644 index 000000000..7ed6cfbbe --- /dev/null +++ b/src/modules/removeuser/removeuser.schema.yaml @@ -0,0 +1,7 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/removeuser +additionalProperties: false +type: object +properties: + "username": { type: string, required: true } diff --git a/src/modules/umount/umount.schema.yaml b/src/modules/umount/umount.schema.yaml new file mode 100644 index 000000000..b76a14ac6 --- /dev/null +++ b/src/modules/umount/umount.schema.yaml @@ -0,0 +1,8 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/umount +additionalProperties: false +type: object +properties: + "srcLog": { type: str } + "destLog": { type: str } diff --git a/src/modules/unpackfs/unpackfs.schema.yaml b/src/modules/unpackfs/unpackfs.schema.yaml new file mode 100644 index 000000000..0d6f0955a --- /dev/null +++ b/src/modules/unpackfs/unpackfs.schema.yaml @@ -0,0 +1,14 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/unpackfs +additionalProperties: false +type: object +properties: + "unpack": + type: seq + sequence: + - type: map + mapping: + "source": { type: string, required: true } + "sourcefs": { type: str } + "destination": { type: str } diff --git a/src/modules/users/users.schema.yaml b/src/modules/users/users.schema.yaml new file mode 100644 index 000000000..b667df7f6 --- /dev/null +++ b/src/modules/users/users.schema.yaml @@ -0,0 +1,18 @@ +--- +$schema: https://json-schema.org/schema# +$id: https://calamares.io/schemas/users +additionalProperties: false +type: object +properties: + "defaultGroups": + required: true + type: seq + sequence: + - { type: str } + "autologinGroup": { type: string, required: true } + "doAutologin": { type: boolean, default: true } + "sudoersGroup": { type: string, required: true } + "setRootPassword": { type: boolean, default: true } + "availableShells": { type: str } + "avatarFilePath": { type: str } + "doReusePassword": { type: boolean, default: true } From 0cd894036363069c5a22abb62eb6b6ae3d2c169c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 16:16:07 +0200 Subject: [PATCH 32/63] [bootloader] Fix up schema --- src/modules/bootloader/bootloader.schema.yaml | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/modules/bootloader/bootloader.schema.yaml b/src/modules/bootloader/bootloader.schema.yaml index 45e8d4996..4670ea3db 100644 --- a/src/modules/bootloader/bootloader.schema.yaml +++ b/src/modules/bootloader/bootloader.schema.yaml @@ -4,15 +4,30 @@ $id: https://calamares.io/schemas/bootloader additionalProperties: false type: object properties: - efiBootLoader: { type: string, required: true } - kernel: { type: string, required: true } - img: { type: string, required: true } - fallback: { type: str } - timeout: { type: str } - bootloaderEntryName: { type: str } - kernelLine: { type: str } - fallbackKernelLine: { type: str } - grubInstall: { type: string, required: true } - grubMkconfig: { type: string, required: true } - grubCfg: { type: string, required: true } - efiBootloaderId: { type: str } + efiBootLoader: { type: string } + kernel: { type: string } + img: { type: string } + fallback: { type: string } + timeout: { type: string } # Inserted verbatim + bootloaderEntryName: { type: string } + kernelLine: { type: string } + fallbackKernelLine: { type: string } + + # Programs + grubInstall: { type: string } + grubMkconfig: { type: string } + grubCfg: { type: string } + grubProbe: { type: string } + efiBootMgr: { type: string } + + efiBootloaderId: { type: string } + installEFIFallback: { type: boolean } + +required: + - efiBootLoader + - kernel + - img + - grubInstall + - grubMkconfig + - grubCfg + - grubProbe From f2a8f0fcddb77c5d6fca8edabbd66122afc69475 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 17:17:59 +0200 Subject: [PATCH 33/63] =?UTF-8?q?Changes:=20thank=20Ga=C3=ABl=20and=20ment?= =?UTF-8?q?ion=20removal=20of=20-tools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index e53c59437..e874dc866 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ website will have to do for older versions. # 3.2.26 (unreleased) # This release contains contributions from (alphabetically by first name): + - Gaël PORTAY - Pablo Ovelleiro Corral - Philip Müller @@ -14,6 +15,10 @@ This release contains contributions from (alphabetically by first name): and calamares-extensions) is now *calamares*. - External modules can now be built again, outside of the Calamares source and build-tree. + - The repository *calamares-tools* has been removed. The idea behind + the tooling was to provide schema validation for Calamares configuration + files. This has been merged into the primary repository, where it + is now part of the test suite. ## Modules ## - *locale* put some more places into the correct timezone **visually**; From 635f53a8044fe2b607865b56236eb0b8f4805ff3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 16 Jun 2020 17:36:59 +0200 Subject: [PATCH 34/63] CI: add a BUILD_SCHEMA_TESTING - ON by default, so if tests are built and the script works, those tests will run as well. - Check that the script works by invoking it once. --- CMakeLists.txt | 19 +++++++++++++++++++ ci/configvalidator.py | 12 ++++++++++++ src/modules/CMakeLists.txt | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4506e9f6c..9795da8ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,7 @@ # - PYTHONQT # TODO:3.3: remove # BUILD_ : choose additional things to build # - TESTING (standard CMake option) +# - SCHEMA_TESTING (requires Python, see ci/configvalidator.py) # DEBUG_ : special developer flags for debugging # # Example usage: @@ -63,6 +64,10 @@ option( WITH_KF5DBus "Use DBus service for unique-application." OFF ) # TODO:3. option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) option( WITH_PYTHONQT "Enable Python view modules API (deprecated, requires PythonQt)." OFF ) # TODO:3.3: remove option( WITH_QML "Enable QML UI options." ON ) +# +# Additional parts to build +option( BUILD_SCHEMA_TESTING "Enable schema-validation-tests" ON ) + # Possible debugging flags are: # - DEBUG_TIMEZONES draws latitude and longitude lines on the timezone @@ -337,6 +342,20 @@ set_package_properties( ) if ( PYTHONINTERP_FOUND ) message(STATUS "Found Python 3 interpreter ${PYTHON_EXECUTABLE}") + if ( BUILD_SCHEMA_TESTING ) + # The configuration validator script has some dependencies, + # and if they are not installed, don't run. If errors out + # with exit(1) on missing dependencies. + exec_program( ${PYTHON_EXECUTABLE} ARGS "${CMAKE_SOURCE_DIR}/ci/configvalidator.py" -x RETURN_VALUE _validator_deps ) + # It should never succeed, but only returns 1 when the imports fail + if ( _validator_deps EQUAL 1 ) + message(STATUS "BUILD_SCHEMA_TESTING dependencies are missing." ) + set( BUILD_SCHEMA_TESTING OFF ) + endif() + endif() +else() + # Can't run schema tests without Python3. + set( BUILD_SCHEMA_TESTING OFF ) endif() find_package( PythonLibs ${PYTHONLIBS_VERSION} ) set_package_properties( diff --git a/ci/configvalidator.py b/ci/configvalidator.py index 858c53224..9d1bc21a5 100644 --- a/ci/configvalidator.py +++ b/ci/configvalidator.py @@ -14,6 +14,15 @@ JSON-representable, anyway. Usage: configvalidator.py ... + configvalidator.py -x + +Exits with value 0 on success, otherwise: + 1 on missing dependencies + 2 on invalid command-line arguments + 3 on missing files + 4 if files have invalid syntax + 5 if files fail to validate +Use -x as only command-line argument to check the imports only. """ # The schemata originally lived outside the Calamares repository, @@ -50,6 +59,9 @@ import sys # # if len(sys.argv) < 3: + # Special-case: called with -x to just test the imports + if len(sys.argv) == 2 and sys.argv[1] == "-x": + exit(0) print(usage) exit(ERR_USAGE) diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt index 0b81c4b3f..08e5a8520 100644 --- a/src/modules/CMakeLists.txt +++ b/src/modules/CMakeLists.txt @@ -68,7 +68,7 @@ include( CalamaresAddTranslations ) add_calamares_python_translations( ${CALAMARES_TRANSLATION_LANGUAGES} ) # TODO:3.3: Use FindPython3 -if ( BUILD_TESTING AND PYTHONINTERP_FOUND AND PYTHON_EXECUTABLE ) +if ( BUILD_TESTING AND BUILD_SCHEMA_TESTING AND PYTHONINTERP_FOUND AND PYTHON_EXECUTABLE ) # The tests for each config file are independent of whether the # module is enabled or not: the config file should match its schema # regardless. From e68723f1c7f5619c532f433d86ef6a6712b2633c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= Date: Mon, 15 Jun 2020 10:16:13 -0400 Subject: [PATCH 35/63] [libcalamares] Handle integers prefixed with 0 or 0x - QString to-integer members detect if an integer string begins with "0x" (base 16) or "0", base 8; but QVariant members do not. - QString: the C language convention is used is base is set to 0. - Convert to QString and use its member toLongLong() and set base to 0 to detect integer strings begin with a prefix. --- src/libcalamares/utils/Variant.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/libcalamares/utils/Variant.cpp b/src/libcalamares/utils/Variant.cpp index e0156c35e..b8173acfa 100644 --- a/src/libcalamares/utils/Variant.cpp +++ b/src/libcalamares/utils/Variant.cpp @@ -72,14 +72,7 @@ getInteger( const QVariantMap& map, const QString& key, qint64 d ) if ( map.contains( key ) ) { auto v = map.value( key ); - if ( v.type() == QVariant::Int ) - { - result = v.toInt(); - } - else if ( v.type() == QVariant::LongLong ) - { - result = v.toLongLong(); - } + result = v.toString().toLongLong(nullptr, 0); } return result; From e84193a2cb5ddeffea7558d44311482e0fca44e2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 00:20:25 +0200 Subject: [PATCH 36/63] Docs: add a FreeBSD port directory (copy it to sysutils/calamares) --- data/FreeBSD/Makefile | 34 +++++++ data/FreeBSD/distinfo | 3 + data/FreeBSD/pkg-descr | 14 +++ data/FreeBSD/pkg-plist | 224 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 275 insertions(+) create mode 100644 data/FreeBSD/Makefile create mode 100644 data/FreeBSD/distinfo create mode 100644 data/FreeBSD/pkg-descr create mode 100644 data/FreeBSD/pkg-plist diff --git a/data/FreeBSD/Makefile b/data/FreeBSD/Makefile new file mode 100644 index 000000000..520a05638 --- /dev/null +++ b/data/FreeBSD/Makefile @@ -0,0 +1,34 @@ +# $FreeBSD$ + +PORTNAME= calamares +DISTVERSION= 3.2.25 +CATEGORIES= sysutils +MASTER_SITES= https://github.com/${PORTNAME}/${PORTNAME}/releases/download/v${DISTVERSION}/ + +MAINTAINER= adridg@FreeBSD.org +COMMENT= GUI System installer and OEM configurator + +LICENSE= GPLv3 +LICENSE_FILE= ${WRKSRC}/LICENSE + +LIB_DEPENDS= libyaml-cpp.so:devel/yaml-cpp \ + libpwquality.so:security/libpwquality \ + libboost_python${PYTHON_SUFFIX}.so:devel/boost-python-libs + +USES= cmake compiler:c++17-lang gettext kde:5 pkgconfig \ + python:3.3+ qt:5 +USE_QT= concurrent core dbus declarative gui \ + network quickcontrols2 svg widgets xml \ + buildtools_build linguist_build qmake_build +USE_KDE= coreaddons dbusaddons parts service \ + ecm_build +USE_LDCONFIG= yes + +CMAKE_OFF= WITH_KF5Crash \ + INSTALL_CONFIG \ + INSTALL_COMPLETION \ + INSTALL_POLKIT +CMAKE_ON= CMAKE_DISABLE_FIND_PACKAGE_KPMcore +CMAKE_ARGS= -DSKIP_MODULES="webview" + +.include diff --git a/data/FreeBSD/distinfo b/data/FreeBSD/distinfo new file mode 100644 index 000000000..e333963a8 --- /dev/null +++ b/data/FreeBSD/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1592339404 +SHA256 (calamares-3.2.25.tar.gz) = 797ce33db7d4e4c06bbccef95f6c4023f7628e91bd142896695565fed4ae8c4b +SIZE (calamares-3.2.25.tar.gz) = 3580197 diff --git a/data/FreeBSD/pkg-descr b/data/FreeBSD/pkg-descr new file mode 100644 index 000000000..39cb4335c --- /dev/null +++ b/data/FreeBSD/pkg-descr @@ -0,0 +1,14 @@ +Calamares is an installer framework. By design it is very customizable, +in order to satisfy a wide variety of needs and use cases. + +Calamares aims to be easy, usable, beautiful, pragmatic, inclusive and +distribution-agnostic. + +Got a Linux distribution but no system installer? Grab Calamares, mix +and match any number of Calamares modules (or write your own in Python +or C++), throw together some branding, package it up and you are ready +to ship! + +(The above applies to FreeBSD as well) + +WWW: https://calamares.io/ diff --git a/data/FreeBSD/pkg-plist b/data/FreeBSD/pkg-plist new file mode 100644 index 000000000..7f588b7a9 --- /dev/null +++ b/data/FreeBSD/pkg-plist @@ -0,0 +1,224 @@ +bin/calamares +include/libcalamares/CalamaresConfig.h +include/libcalamares/CppJob.h +include/libcalamares/DllMacro.h +include/libcalamares/GlobalStorage.h +include/libcalamares/Job.h +include/libcalamares/JobExample.h +include/libcalamares/JobQueue.h +include/libcalamares/ProcessJob.h +include/libcalamares/PythonHelper.h +include/libcalamares/PythonJob.h +include/libcalamares/PythonJobApi.h +include/libcalamares/Settings.h +include/libcalamares/utils/BoostPython.h +include/libcalamares/utils/CalamaresUtilsSystem.h +include/libcalamares/utils/CommandList.h +include/libcalamares/utils/Dirs.h +include/libcalamares/utils/Entropy.h +include/libcalamares/utils/Logger.h +include/libcalamares/utils/NamedEnum.h +include/libcalamares/utils/NamedSuffix.h +include/libcalamares/utils/PluginFactory.h +include/libcalamares/utils/RAII.h +include/libcalamares/utils/Retranslator.h +include/libcalamares/utils/String.h +include/libcalamares/utils/Tests.h +include/libcalamares/utils/UMask.h +include/libcalamares/utils/Units.h +include/libcalamares/utils/Variant.h +include/libcalamares/utils/Yaml.h +include/libcalamares/utils/moc-warnings.h +lib/calamares/libcalamares.so +lib/calamares/modules/bootloader/main.py +lib/calamares/modules/bootloader/module.desc +lib/calamares/modules/bootloader/test.yaml +lib/calamares/modules/contextualprocess/libcalamares_job_contextualprocess.so +lib/calamares/modules/contextualprocess/module.desc +lib/calamares/modules/displaymanager/main.py +lib/calamares/modules/displaymanager/module.desc +lib/calamares/modules/dracut/main.py +lib/calamares/modules/dracut/module.desc +lib/calamares/modules/dracutlukscfg/libcalamares_job_dracutlukscfg.so +lib/calamares/modules/dracutlukscfg/module.desc +lib/calamares/modules/dummycpp/libcalamares_job_dummycpp.so +lib/calamares/modules/dummycpp/module.desc +lib/calamares/modules/dummyprocess/module.desc +lib/calamares/modules/dummypython/main.py +lib/calamares/modules/dummypython/module.desc +lib/calamares/modules/finished/libcalamares_viewmodule_finished.so +lib/calamares/modules/finished/module.desc +lib/calamares/modules/fstab/main.py +lib/calamares/modules/fstab/module.desc +lib/calamares/modules/fstab/test.yaml +lib/calamares/modules/grubcfg/main.py +lib/calamares/modules/grubcfg/module.desc +lib/calamares/modules/hostinfo/libcalamares_job_hostinfo.so +lib/calamares/modules/hostinfo/module.desc +lib/calamares/modules/hwclock/main.py +lib/calamares/modules/hwclock/module.desc +lib/calamares/modules/initcpio/libcalamares_job_initcpio.so +lib/calamares/modules/initcpio/module.desc +lib/calamares/modules/initcpiocfg/main.py +lib/calamares/modules/initcpiocfg/module.desc +lib/calamares/modules/initramfs/libcalamares_job_initramfs.so +lib/calamares/modules/initramfs/module.desc +lib/calamares/modules/initramfscfg/encrypt_hook +lib/calamares/modules/initramfscfg/encrypt_hook_nokey +lib/calamares/modules/initramfscfg/main.py +lib/calamares/modules/initramfscfg/module.desc +lib/calamares/modules/interactiveterminal/libcalamares_viewmodule_interactiveterminal.so +lib/calamares/modules/interactiveterminal/module.desc +lib/calamares/modules/keyboard/libcalamares_viewmodule_keyboard.so +lib/calamares/modules/keyboard/module.desc +lib/calamares/modules/keyboardq/libcalamares_viewmodule_keyboardq.so +lib/calamares/modules/keyboardq/module.desc +lib/calamares/modules/license/libcalamares_viewmodule_license.so +lib/calamares/modules/license/module.desc +lib/calamares/modules/locale/libcalamares_viewmodule_locale.so +lib/calamares/modules/locale/module.desc +lib/calamares/modules/localecfg/main.py +lib/calamares/modules/localecfg/module.desc +lib/calamares/modules/localeq/libcalamares_viewmodule_localeq.so +lib/calamares/modules/localeq/module.desc +lib/calamares/modules/luksbootkeyfile/libcalamares_job_luksbootkeyfile.so +lib/calamares/modules/luksbootkeyfile/module.desc +lib/calamares/modules/luksopenswaphookcfg/main.py +lib/calamares/modules/luksopenswaphookcfg/module.desc +lib/calamares/modules/machineid/libcalamares_job_machineid.so +lib/calamares/modules/machineid/module.desc +lib/calamares/modules/mount/main.py +lib/calamares/modules/mount/module.desc +lib/calamares/modules/mount/test.yaml +lib/calamares/modules/netinstall/libcalamares_viewmodule_netinstall.so +lib/calamares/modules/netinstall/module.desc +lib/calamares/modules/networkcfg/main.py +lib/calamares/modules/networkcfg/module.desc +lib/calamares/modules/notesqml/libcalamares_viewmodule_notesqml.so +lib/calamares/modules/notesqml/module.desc +lib/calamares/modules/oemid/libcalamares_viewmodule_oemid.so +lib/calamares/modules/oemid/module.desc +lib/calamares/modules/openrcdmcryptcfg/main.py +lib/calamares/modules/openrcdmcryptcfg/module.desc +lib/calamares/modules/packagechooser/libcalamares_viewmodule_packagechooser.so +lib/calamares/modules/packagechooser/module.desc +lib/calamares/modules/packages/main.py +lib/calamares/modules/packages/module.desc +lib/calamares/modules/packages/test.yaml +lib/calamares/modules/plymouthcfg/main.py +lib/calamares/modules/plymouthcfg/module.desc +lib/calamares/modules/preservefiles/libcalamares_job_preservefiles.so +lib/calamares/modules/preservefiles/module.desc +lib/calamares/modules/rawfs/main.py +lib/calamares/modules/rawfs/module.desc +lib/calamares/modules/removeuser/libcalamares_job_removeuser.so +lib/calamares/modules/removeuser/module.desc +lib/calamares/modules/services-openrc/main.py +lib/calamares/modules/services-openrc/module.desc +lib/calamares/modules/services-systemd/main.py +lib/calamares/modules/services-systemd/module.desc +lib/calamares/modules/shellprocess/libcalamares_job_shellprocess.so +lib/calamares/modules/shellprocess/module.desc +lib/calamares/modules/summary/libcalamares_viewmodule_summary.so +lib/calamares/modules/summary/module.desc +lib/calamares/modules/tracking/libcalamares_viewmodule_tracking.so +lib/calamares/modules/tracking/module.desc +lib/calamares/modules/umount/main.py +lib/calamares/modules/umount/module.desc +lib/calamares/modules/unpackfs/main.py +lib/calamares/modules/unpackfs/module.desc +lib/calamares/modules/unpackfs/runtests.sh +lib/calamares/modules/users/libcalamares_viewmodule_users.so +lib/calamares/modules/users/module.desc +lib/calamares/modules/welcome/libcalamares_viewmodule_welcome.so +lib/calamares/modules/welcome/module.desc +lib/calamares/modules/welcomeq/libcalamares_viewmodule_welcomeq.so +lib/calamares/modules/welcomeq/module.desc +lib/cmake/Calamares/CMakeColors.cmake +lib/cmake/Calamares/CalamaresAddBrandingSubdirectory.cmake +lib/cmake/Calamares/CalamaresAddLibrary.cmake +lib/cmake/Calamares/CalamaresAddModuleSubdirectory.cmake +lib/cmake/Calamares/CalamaresAddPlugin.cmake +lib/cmake/Calamares/CalamaresAddTest.cmake +lib/cmake/Calamares/CalamaresAddTranslations.cmake +lib/cmake/Calamares/CalamaresAutomoc.cmake +lib/cmake/Calamares/CalamaresConfig.cmake +lib/cmake/Calamares/CalamaresConfigVersion.cmake +lib/cmake/Calamares/CalamaresLibraryDepends-%%CMAKE_BUILD_TYPE%%.cmake +lib/cmake/Calamares/CalamaresLibraryDepends.cmake +lib/cmake/Calamares/CalamaresUse.cmake +lib/libcalamares.so +lib/libcalamares.so.3.2.25 +lib/libcalamaresui.so +lib/libcalamaresui.so.3.2.25 +man/man8/calamares.8.gz +share/applications/calamares.desktop +%%DATADIR%%/branding/default/banner.png +%%DATADIR%%/branding/default/branding.desc +%%DATADIR%%/branding/default/lang/calamares-default_ar.qm +%%DATADIR%%/branding/default/lang/calamares-default_en.qm +%%DATADIR%%/branding/default/lang/calamares-default_eo.qm +%%DATADIR%%/branding/default/lang/calamares-default_fr.qm +%%DATADIR%%/branding/default/lang/calamares-default_nl.qm +%%DATADIR%%/branding/default/languages.png +%%DATADIR%%/branding/default/show.qml +%%DATADIR%%/branding/default/squid.png +%%DATADIR%%/branding/default/stylesheet.qss +%%DATADIR%%/qml/calamares/slideshow/BackButton.qml +%%DATADIR%%/qml/calamares/slideshow/ForwardButton.qml +%%DATADIR%%/qml/calamares/slideshow/NavButton.qml +%%DATADIR%%/qml/calamares/slideshow/Presentation.qml +%%DATADIR%%/qml/calamares/slideshow/Slide.qml +%%DATADIR%%/qml/calamares/slideshow/SlideCounter.qml +%%DATADIR%%/qml/calamares/slideshow/qmldir +share/icons/hicolor/scalable/apps/calamares.svg +share/locale/ar/LC_MESSAGES/calamares-python.mo +share/locale/as/LC_MESSAGES/calamares-python.mo +share/locale/ast/LC_MESSAGES/calamares-python.mo +share/locale/be/LC_MESSAGES/calamares-python.mo +share/locale/bg/LC_MESSAGES/calamares-python.mo +share/locale/ca/LC_MESSAGES/calamares-python.mo +share/locale/cs_CZ/LC_MESSAGES/calamares-python.mo +share/locale/da/LC_MESSAGES/calamares-python.mo +share/locale/de/LC_MESSAGES/calamares-python.mo +share/locale/el/LC_MESSAGES/calamares-python.mo +share/locale/en_GB/LC_MESSAGES/calamares-python.mo +share/locale/eo/LC_MESSAGES/calamares-python.mo +share/locale/es/LC_MESSAGES/calamares-python.mo +share/locale/es_MX/LC_MESSAGES/calamares-python.mo +share/locale/es_PR/LC_MESSAGES/calamares-python.mo +share/locale/et/LC_MESSAGES/calamares-python.mo +share/locale/eu/LC_MESSAGES/calamares-python.mo +share/locale/fi_FI/LC_MESSAGES/calamares-python.mo +share/locale/fr/LC_MESSAGES/calamares-python.mo +share/locale/gl/LC_MESSAGES/calamares-python.mo +share/locale/he/LC_MESSAGES/calamares-python.mo +share/locale/hi/LC_MESSAGES/calamares-python.mo +share/locale/hr/LC_MESSAGES/calamares-python.mo +share/locale/hu/LC_MESSAGES/calamares-python.mo +share/locale/id/LC_MESSAGES/calamares-python.mo +share/locale/is/LC_MESSAGES/calamares-python.mo +share/locale/it_IT/LC_MESSAGES/calamares-python.mo +share/locale/ja/LC_MESSAGES/calamares-python.mo +share/locale/ko/LC_MESSAGES/calamares-python.mo +share/locale/lt/LC_MESSAGES/calamares-python.mo +share/locale/ml/LC_MESSAGES/calamares-python.mo +share/locale/mr/LC_MESSAGES/calamares-python.mo +share/locale/nb/LC_MESSAGES/calamares-python.mo +share/locale/nl/LC_MESSAGES/calamares-python.mo +share/locale/pl/LC_MESSAGES/calamares-python.mo +share/locale/pt_BR/LC_MESSAGES/calamares-python.mo +share/locale/pt_PT/LC_MESSAGES/calamares-python.mo +share/locale/ro/LC_MESSAGES/calamares-python.mo +share/locale/ru/LC_MESSAGES/calamares-python.mo +share/locale/sk/LC_MESSAGES/calamares-python.mo +share/locale/sl/LC_MESSAGES/calamares-python.mo +share/locale/sq/LC_MESSAGES/calamares-python.mo +share/locale/sr/LC_MESSAGES/calamares-python.mo +share/locale/sr@latin/LC_MESSAGES/calamares-python.mo +share/locale/sv/LC_MESSAGES/calamares-python.mo +share/locale/th/LC_MESSAGES/calamares-python.mo +share/locale/tr_TR/LC_MESSAGES/calamares-python.mo +share/locale/uk/LC_MESSAGES/calamares-python.mo +share/locale/zh_CN/LC_MESSAGES/calamares-python.mo +share/locale/zh_TW/LC_MESSAGES/calamares-python.mo From dda4ab0b2e44fc35524e1d49d94cddc178a2dff2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 10:06:33 +0200 Subject: [PATCH 37/63] [tracking] Improve naming - give the on-some-checkbox-state-changed slots better names - while here, refactor is-any-actual-tracking-option-checked - improve other debug messages, to be a whole sentence --- src/modules/tracking/TrackingPage.cpp | 30 +++++++++++++-------------- src/modules/tracking/TrackingPage.h | 11 ++++++++-- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index e42ae2312..fa5cba2bb 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -41,14 +41,14 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) CALAMARES_RETRANSLATE_SLOT( &TrackingPage::retranslate ); ui->noneCheckBox->setChecked( true ); - connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::noneChecked ); - connect( ui->installCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::otherChecked ); - connect( ui->machineCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::otherChecked ); - connect( ui->userCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::otherChecked ); + connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonNoneChecked ); + connect( ui->installCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); + connect( ui->machineCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); + connect( ui->userCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); connect( ui->installCheckBox, &QCheckBox::stateChanged, [ this ]( int s ) { cDebug() << "Checkbox install changed" << s; } ); connect( config->installTracking(), &TrackingStyleConfig::trackingChanged, [ config ]() { cDebug() << - "Install tracking changed" << config->installTracking()->isEnabled(); } ) ; + "Install tracking configuration changed to " << config->installTracking()->isEnabled(); } ) ; connect( config, &Config::generalPolicyChanged, [ this ]( const QString& url ) { this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); @@ -87,20 +87,25 @@ TrackingPage::retranslate() .arg( product ) ); } -void TrackingPage::noneChecked(int state) +bool TrackingPage::anyOtherChecked() const +{ + return ui->installCheckBox->isChecked() || ui->machineCheckBox->isChecked() || ui->userCheckBox->isChecked(); +} + + +void TrackingPage::buttonNoneChecked(int state) { if ( state ) { - cDebug() << "Unchecking all due to none box"; + cDebug() << "Unchecking all other buttons because 'None' was checked"; ui->installCheckBox->setChecked( false ); ui->machineCheckBox->setChecked( false ); ui->userCheckBox->setChecked( false ); } } -void TrackingPage::otherChecked(int state) +void TrackingPage::buttonChecked(int state) { - cDebug() << "Other checked" << state; if ( state ) { // Can't have none checked, if another one is @@ -108,12 +113,7 @@ void TrackingPage::otherChecked(int state) } else { - if ( ui->installCheckBox->isChecked() || ui->machineCheckBox->isChecked() || ui->userCheckBox->isChecked() ) - { - // One of them is still checked, leave *none* alone - ; - } - else + if ( !anyOtherChecked() ) { ui->noneCheckBox->setChecked( true ); } diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index e4c465fbc..1a995870d 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -37,6 +37,13 @@ class TrackingPage : public QWidget public: explicit TrackingPage( Config* config, QWidget* parent = nullptr ); + /** @brief is any of the enable-tracking buttons checked? + * + * Returns true if any one or more of install, machine or user + * tracking is enabled. + */ + bool anyOtherChecked() const; + public Q_SLOTS: void retranslate(); @@ -45,14 +52,14 @@ public Q_SLOTS: * @p state will be non-zero when the box is checked; this * **unchecks** all the other boxes. */ - void noneChecked( int state ); + void buttonNoneChecked( int state ); /** @brief Some other checkbox changed * * This may check the *none* button if all the others are * now unchecked. */ - void otherChecked( int state ); + void buttonChecked( int state ); private: Ui::TrackingPage* ui; From c797a30a72050a525785c24917de56a7f5a73ce4 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 10:10:20 +0200 Subject: [PATCH 38/63] [tracking] Bold more relevant parts of level-descriptions --- src/modules/tracking/TrackingPage.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index fa5cba2bb..cb7e5a10a 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -76,14 +76,14 @@ TrackingPage::retranslate() .arg( product ) ); ui->installExplanation->setText( tr( "By selecting this you will send information about your installation and hardware. This information " - "will only be sent once after the installation finishes." ) ); + "will only be sent once after the installation finishes." ) ); ui->machineExplanation->setText( - tr( "By selecting this you will periodically send information about your machine installation, " + tr( "By selecting this you will periodically send information about your machine installation, " "hardware and applications, to %1." ) .arg( product ) ); ui->userExplanation->setText( - tr( "By selecting this you will regularly send information about your " - "user installation, hardware, applications and application usage patterns, to %1." ) + tr( "By selecting this you will regularly send information about your " + "user installation, hardware, applications and application usage patterns, to %1." ) .arg( product ) ); } From 4d6a5d0cb537d9af4968f0b68a2cc274b38fa11f Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 10:36:35 +0200 Subject: [PATCH 39/63] [tracking] Use KMacroExpander instead of homebrew for install-URL --- src/modules/tracking/TrackingJobs.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 18d01c7ca..0b27eab05 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -24,6 +24,8 @@ #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" +#include + #include #include @@ -79,14 +81,13 @@ TrackingInstallJob::addJob( Calamares::JobList& list, InstallTrackingConfig* con { if ( config->isEnabled() ) { - QString installUrl = config->installTrackingUrl(); const auto* s = CalamaresUtils::System::instance(); - - QString memory, disk; - memory.setNum( s->getTotalMemoryB().first ); - disk.setNum( s->getTotalDiskB() ); - - installUrl.replace( "$CPU", s->getCpuDescription() ).replace( "$MEMORY", memory ).replace( "$DISK", disk ); + QHash map { std::initializer_list< std::pair< QString, QString > > { + { QStringLiteral("CPU"), s->getCpuDescription() }, + { QStringLiteral("MEMORY"), QString::number( s->getTotalMemoryB().first ) }, + { QStringLiteral("DISK"), QString::number( s->getTotalDiskB() ) } + } }; + QString installUrl = KMacroExpander::expandMacros( config->installTrackingUrl(), map ); cDebug() << Logger::SubEntry << "install-tracking URL" << installUrl; From cb2909f6d875fa90f15f50f45f633ff8e8f59b13 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 10:18:08 +0200 Subject: [PATCH 40/63] [tracking] Rename "neon" tracking KDE neon does not do this kind of tracking -- although it was originally requested by KDE neon, no server roll-out was done once the privacy policy was thought out. --- src/modules/tracking/Config.cpp | 2 +- src/modules/tracking/Config.h | 2 +- src/modules/tracking/TrackingJobs.cpp | 12 ++++++------ src/modules/tracking/TrackingJobs.h | 6 +++--- src/modules/tracking/TrackingViewStep.cpp | 8 -------- src/modules/tracking/tracking.conf | 4 ++-- 6 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 2dc91c2a9..a75522529 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -129,7 +129,7 @@ MachineTrackingConfig::MachineTrackingConfig( QObject* parent ) static bool isValidMachineTrackingStyle( const QString& s ) { - static QStringList knownStyles { "neon" }; + static QStringList knownStyles { "updatemanager" }; return knownStyles.contains( s ); } diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index 26dcf2f4f..0bdff260a 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -118,7 +118,7 @@ private: * * When machine tracking is on, the installed system will report * back ("call home") at some point. This can mean Debian pop-con, - * or KDE neon maching tracking, or something else. The kind + * or updatemanager maching tracking, or something else. The kind * of configuration depends on the style of tracking that is enabled. */ class MachineTrackingConfig : public TrackingStyleConfig diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 0b27eab05..70e45e2eb 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -101,9 +101,9 @@ TrackingMachineJob::addJob( Calamares::JobList& list, MachineTrackingConfig* con if ( config->isEnabled() ) { const auto style = config->machineTrackingStyle(); - if ( style == "neon" ) + if ( style == "updatemanager" ) { - list.append( Calamares::job_ptr( new TrackingMachineNeonJob() ) ); + list.append( Calamares::job_ptr( new TrackingMachineUpdateManagerJob() ) ); } else { @@ -114,25 +114,25 @@ TrackingMachineJob::addJob( Calamares::JobList& list, MachineTrackingConfig* con QString -TrackingMachineNeonJob::prettyName() const +TrackingMachineUpdateManagerJob::prettyName() const { return tr( "Machine feedback" ); } QString -TrackingMachineNeonJob::prettyDescription() const +TrackingMachineUpdateManagerJob::prettyDescription() const { return prettyName(); } QString -TrackingMachineNeonJob::prettyStatusMessage() const +TrackingMachineUpdateManagerJob::prettyStatusMessage() const { return tr( "Configuring machine feedback." ); } Calamares::JobResult -TrackingMachineNeonJob::exec() +TrackingMachineUpdateManagerJob::exec() { static const auto script = QStringLiteral( R"x( diff --git a/src/modules/tracking/TrackingJobs.h b/src/modules/tracking/TrackingJobs.h index 76e7dbed9..dd5ca6b92 100644 --- a/src/modules/tracking/TrackingJobs.h +++ b/src/modules/tracking/TrackingJobs.h @@ -76,13 +76,13 @@ public: static void addJob( Calamares::JobList& list, MachineTrackingConfig* config ); }; -/** @brief Tracking machines, KDE neon style +/** @brief Tracking machines, update-manager style * * The machine has a machine-id, and this is sed(1)'ed into the * update-manager configuration, to report the machine-id back - * to KDE neon servers. + * to distro servers. */ -class TrackingMachineNeonJob : public TrackingMachineJob +class TrackingMachineUpdateManagerJob : public TrackingMachineJob { Q_OBJECT public: diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 491fef12a..2cbfe4ae2 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -34,14 +34,6 @@ CALAMARES_PLUGIN_FACTORY_DEFINITION( TrackingViewStepFactory, registerPlugin< TrackingViewStep >(); ) -/** @brief Is @p s a valid machine-tracking style. */ -static bool -isValidStyle( const QString& s ) -{ - static QStringList knownStyles { "neon" }; - return knownStyles.contains( s ); -} - TrackingViewStep::TrackingViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_config( new Config( this ) ) diff --git a/src/modules/tracking/tracking.conf b/src/modules/tracking/tracking.conf index 46ba7fed6..8569f0935 100644 --- a/src/modules/tracking/tracking.conf +++ b/src/modules/tracking/tracking.conf @@ -77,11 +77,11 @@ install: # The machine area has one specific configuration key: # style: This string specifies what kind of tracking configuration # needs to be done. There is currently only one valid -# style, "neon", which edits two files in the installed +# style, "updatemanager", which edits two files in the installed # system to enable system-tracking. machine: enabled: false - style: neon + style: updatemanager # The user area is not yet implemented, and has no specific configuration. user: From 48d0c5beeb3587a815d990b8e95f5003eb6f99a2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 11:02:59 +0200 Subject: [PATCH 41/63] [tracking] Do user tracking in the job queue --- src/modules/tracking/TrackingViewStep.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 2cbfe4ae2..125d17974 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -111,6 +111,8 @@ TrackingViewStep::jobs() const Calamares::JobList l; TrackingInstallJob::addJob( l, m_config->installTracking() ); TrackingMachineJob::addJob( l, m_config->machineTracking() ); + TrackingUserJob::addJob( l, m_config->userTracking() ); + cDebug() << Logger::SubEntry << l.count() << "jobs queued."; return l; } From 9433311f2404066b94eafdf56dd041c8e370f1f8 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 11:17:48 +0200 Subject: [PATCH 42/63] [tracking] Explain which tracking style is disabled by URL-validation --- src/modules/tracking/Config.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index a75522529..30c6c30d1 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -87,7 +87,7 @@ TrackingStyleConfig::validateUrl( QString& urlString ) { if ( m_state != DisabledByConfig ) { - cError() << "URL" << urlString << "is not valid; disabling this tracking type."; + cError() << "URL" << urlString << "is not valid; disabling tracking type" << objectName(); m_state = DisabledByConfig; emit trackingChanged(); } @@ -109,6 +109,7 @@ TrackingStyleConfig::setConfigurationMap( const QVariantMap& config ) InstallTrackingConfig::InstallTrackingConfig( QObject* parent ) : TrackingStyleConfig( parent ) { + setObjectName( "InstallTrackingConfig" ); } void @@ -123,6 +124,7 @@ InstallTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap MachineTrackingConfig::MachineTrackingConfig( QObject* parent ) : TrackingStyleConfig( parent ) { + setObjectName( "MachineTrackingConfig" ); } /** @brief Is @p s a valid machine-tracking style. */ @@ -146,6 +148,7 @@ MachineTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap UserTrackingConfig::UserTrackingConfig( QObject* parent ) : TrackingStyleConfig( parent ) { + setObjectName( "UserTrackingConfig" ); } static bool From 756e3084dc421a2db0cc3e0bb1110b3d3751df8d Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 11:30:12 +0200 Subject: [PATCH 43/63] [tracking] Simplify updatemanager job - sed all the URI lines with a simple replacement - document policy requirements --- src/modules/tracking/TrackingJobs.cpp | 20 +++++++++----------- src/modules/tracking/tracking.conf | 14 ++++++++++---- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 70e45e2eb..3d8ea27f1 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -134,17 +134,15 @@ TrackingMachineUpdateManagerJob::prettyStatusMessage() const Calamares::JobResult TrackingMachineUpdateManagerJob::exec() { - static const auto script = QStringLiteral( - R"x( -MACHINE_ID=`cat /etc/machine-id` -sed -i "s,URI =.*,URI = http://releases.neon.kde.org/meta-release/${MACHINE_ID}," /etc/update-manager/meta-release -sed -i "s,URI_LTS =.*,URI_LTS = http://releases.neon.kde.org/meta-release-lts/${MACHINE_ID}," /etc/update-manager/meta-release -true -)x" ); - int r = CalamaresUtils::System::instance()->targetEnvCall( "/bin/sh", - QString(), // Working dir - script, - std::chrono::seconds( 1 ) ); + static const auto script = QStringLiteral( "sed -i '/^URI/s,${MACHINE_ID},'`cat /etc/machine-id`',' /etc/update-manager/meta-release || true" ); + + auto res = CalamaresUtils::System::instance()->runCommand( + CalamaresUtils::System::RunLocation::RunInTarget, + QStringList { QStringLiteral( "/bin/sh" ) }, + QString(), // Working dir + script, // standard input + std::chrono::seconds( 1 ) ); + int r = res.first; if ( r == 0 ) { diff --git a/src/modules/tracking/tracking.conf b/src/modules/tracking/tracking.conf index 8569f0935..88d1e7b59 100644 --- a/src/modules/tracking/tracking.conf +++ b/src/modules/tracking/tracking.conf @@ -34,8 +34,10 @@ # Each area has a key *policy*, which is a Url to be opened when # the user clicks on the corresponding Help button for an explanation # of the details of that particular kind of tracking. If no policy -# is set, the help button is hidden. The example policy links -# go to Calamares' generic user manual. +# is set, that tracking style is disabled. The example policy links +# go to Calamares' generic user manual (which is a terrible idea +# for distro's: you have GDPR obligations under most of these tracking +# styles, so do your homework). # # Each area may have other configuration keys, depending on the # area and how it needs to be configured. @@ -48,8 +50,7 @@ --- # This is the global policy; it is displayed as a link on the page. # If blank or commented out, no link is displayed on the tracking -# page. It is recommended to either provide policy URLs for each -# area, *or* one general link, and not to mix them. +# page. You **must** provide policy links per-area as well. policy: "https://github.com/calamares/calamares/wiki/Use-Guide#installation-tracking" # This is the default level to enable for tracking. If commented out, @@ -79,9 +80,14 @@ install: # needs to be done. There is currently only one valid # style, "updatemanager", which edits two files in the installed # system to enable system-tracking. +# +# Per-style documentation: +# - updatemanager replaces the literal string "${MACHINE_ID}" with the contents of +# /etc/machine-id, in lines starting with "URI" in the file /etc/update-manager/meta-release machine: enabled: false style: updatemanager + policy: "https://github.com/calamares/calamares/wiki/Use-Guide#machine-tracking" # The user area is not yet implemented, and has no specific configuration. user: From 8c1685d2cf327fc97f71a37a728c21b43ac07697 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 12:20:35 +0200 Subject: [PATCH 44/63] [tracking] Connect UI to configuration - policy buttons open the policy URL - hide tracking levels that are not configurable --- src/modules/tracking/TrackingPage.cpp | 33 +++++++++++++++++++++------ src/modules/tracking/TrackingPage.h | 10 ++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index cb7e5a10a..d206a20a3 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -29,7 +29,6 @@ #include "utils/Logger.h" #include "utils/Retranslator.h" -#include #include #include @@ -42,13 +41,26 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) ui->noneCheckBox->setChecked( true ); connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonNoneChecked ); - connect( ui->installCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); - connect( ui->machineCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); - connect( ui->userCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); - connect( ui->installCheckBox, &QCheckBox::stateChanged, [ this ]( int s ) { cDebug() << "Checkbox install changed" << s; } ); - connect( config->installTracking(), &TrackingStyleConfig::trackingChanged, [ config ]() { cDebug() << - "Install tracking configuration changed to " << config->installTracking()->isEnabled(); } ) ; + // Each "panel" of configuration has the same kind of setup, + // where the xButton and xCheckBox is connected to the xTracking + // configuration object; that takes macro-trickery, unfortunately. +#define trackingSetup(x) { \ + connect( ui->x ## CheckBox, &QCheckBox::stateChanged, \ + this, &TrackingPage::buttonChecked ); \ + connect( ui->x ## CheckBox, &QCheckBox::stateChanged, \ + config->x ## Tracking(), QOverload::of( &TrackingStyleConfig::setTracking ) ); \ + connect( config->x ## Tracking(), &TrackingStyleConfig::trackingChanged, \ + this, [ this, config ]() { this->trackerChanged( config->x ## Tracking(), this->ui->x ## Group, this->ui->x ## CheckBox);} ); \ + connect( ui->x ## PolicyButton, &QAbstractButton::clicked, \ + config, [ config ] { QString url( config->x ## Tracking()->policy() ); if ( !url.isEmpty() ) { QDesktopServices::openUrl( url ); } } ); \ +} + + trackingSetup( install ) + trackingSetup( machine ) + trackingSetup( user ) + +#undef trackingSetup connect( config, &Config::generalPolicyChanged, [ this ]( const QString& url ) { this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); @@ -119,3 +131,10 @@ void TrackingPage::buttonChecked(int state) } } } + +void +TrackingPage::trackerChanged(TrackingStyleConfig* config, QWidget* panel, QCheckBox* check) +{ + panel->setVisible( config->isConfigurable() ); + check->setChecked( config->isEnabled() ); +} diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index 1a995870d..48599ead4 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -21,6 +21,7 @@ #include "TrackingType.h" +#include #include #include @@ -30,6 +31,7 @@ class TrackingPage; } class Config; +class TrackingStyleConfig; class TrackingPage : public QWidget { @@ -62,6 +64,14 @@ public Q_SLOTS: void buttonChecked( int state ); private: + /** @brief Apply the tracking configuration to the UI + * + * If the config cannot be changed (disabled in config) then + * hide the UI parts on the @p panel; otherwise show it + * and set @p check state to whether the user has enabled it. + */ + void trackerChanged( TrackingStyleConfig* subconfig, QWidget* panel, QCheckBox* check); + Ui::TrackingPage* ui; }; From 45aac7db6658eacbb8095cf712fc87e24fdb96d0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 07:53:40 -0400 Subject: [PATCH 45/63] CI: update clang-format In clang-format 10, SpaceInEmptyBlock is introduced, and defaults to true .. which is different from the earlier formatting versions did. For now, refuse clang-format 10, and search specifically also for clang-format-9.0.1 because that's what I have on my laptop. At some point, switch in the config option and then require clang-format 10 or later (because earlier versions refuse to run with an unknown config option) --- .clang-format | 1 + ci/calamaresstyle | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index cc430e627..187c3638f 100644 --- a/.clang-format +++ b/.clang-format @@ -26,6 +26,7 @@ ReflowComments: "false" SortIncludes: "true" SpaceAfterCStyleCast: "false" SpacesBeforeTrailingComments: "2" +# SpaceInEmptyBlock: "true" SpacesInAngles: "true" SpacesInParentheses: "true" SpacesInSquareBrackets: "true" diff --git a/ci/calamaresstyle b/ci/calamaresstyle index 6a8285124..44f9fe91f 100755 --- a/ci/calamaresstyle +++ b/ci/calamaresstyle @@ -13,7 +13,7 @@ export LANG LC_ALL LC_NUMERIC AS=$( which astyle ) -CF_VERSIONS="clang-format-7 clang-format-8 clang-format70 clang-format80 clang-format" +CF_VERSIONS="clang-format-7 clang-format-8 clang-format70 clang-format80 clang-format-9.0.1 clang-format" for _cf in $CF_VERSIONS do # Not an error if this particular clang-format isn't found @@ -26,6 +26,8 @@ test -n "$CF" || { echo "! No clang-format ($CF_VERSIONS) found in PATH"; exit 1 test -x "$AS" || { echo "! $AS is not executable."; exit 1 ; } test -x "$CF" || { echo "! $CF is not executable."; exit 1 ; } +expr `"$CF" --version | tr -dc '[^.0-9]' | cut -d . -f 1` '<' 10 > /dev/null || { echo "! $CF is version 10 or later, needs different .clang-format" ; exit 1 ; } + set -e any_dirs=no From 789561be6a6c4f1ff280c6c01bb4688ca3b97bfb Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 14:14:06 +0200 Subject: [PATCH 46/63] [tracking] Apply coding style --- src/modules/tracking/Config.cpp | 28 ++++++------ src/modules/tracking/TrackingJobs.cpp | 25 +++++------ src/modules/tracking/TrackingPage.cpp | 53 +++++++++++++---------- src/modules/tracking/TrackingPage.h | 2 +- src/modules/tracking/TrackingViewStep.cpp | 1 - 5 files changed, 58 insertions(+), 51 deletions(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 30c6c30d1..723465862 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -47,7 +47,7 @@ TrackingStyleConfig::TrackingStyleConfig( QObject* parent ) { } -TrackingStyleConfig::~TrackingStyleConfig() { } +TrackingStyleConfig::~TrackingStyleConfig() {} void TrackingStyleConfig::setTracking( bool enabled ) @@ -179,20 +179,20 @@ Config::Config( QObject* parent ) static void enableLevelsBelow( Config* config, TrackingType level ) { - switch( level ) + switch ( level ) { - case TrackingType::UserTracking: - config->userTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); - FALLTHRU; - case TrackingType::MachineTracking: - config->machineTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); - FALLTHRU; - case TrackingType::InstallTracking: - config->installTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); - break; - case TrackingType::NoTracking: - config->noTracking( true ); - break; + case TrackingType::UserTracking: + config->userTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); + FALLTHRU; + case TrackingType::MachineTracking: + config->machineTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); + FALLTHRU; + case TrackingType::InstallTracking: + config->installTracking()->setTracking( TrackingStyleConfig::TrackingState::EnabledByUser ); + break; + case TrackingType::NoTracking: + config->noTracking( true ); + break; } } diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 3d8ea27f1..cd885194c 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -36,7 +36,7 @@ TrackingInstallJob::TrackingInstallJob( const QString& url ) { } -TrackingInstallJob::~TrackingInstallJob() { } +TrackingInstallJob::~TrackingInstallJob() {} QString TrackingInstallJob::prettyName() const @@ -82,11 +82,10 @@ TrackingInstallJob::addJob( Calamares::JobList& list, InstallTrackingConfig* con if ( config->isEnabled() ) { const auto* s = CalamaresUtils::System::instance(); - QHash map { std::initializer_list< std::pair< QString, QString > > { - { QStringLiteral("CPU"), s->getCpuDescription() }, - { QStringLiteral("MEMORY"), QString::number( s->getTotalMemoryB().first ) }, - { QStringLiteral("DISK"), QString::number( s->getTotalDiskB() ) } - } }; + QHash< QString, QString > map { std::initializer_list< std::pair< QString, QString > > { + { QStringLiteral( "CPU" ), s->getCpuDescription() }, + { QStringLiteral( "MEMORY" ), QString::number( s->getTotalMemoryB().first ) }, + { QStringLiteral( "DISK" ), QString::number( s->getTotalDiskB() ) } } }; QString installUrl = KMacroExpander::expandMacros( config->installTrackingUrl(), map ); cDebug() << Logger::SubEntry << "install-tracking URL" << installUrl; @@ -134,14 +133,14 @@ TrackingMachineUpdateManagerJob::prettyStatusMessage() const Calamares::JobResult TrackingMachineUpdateManagerJob::exec() { - static const auto script = QStringLiteral( "sed -i '/^URI/s,${MACHINE_ID},'`cat /etc/machine-id`',' /etc/update-manager/meta-release || true" ); + static const auto script = QStringLiteral( + "sed -i '/^URI/s,${MACHINE_ID},'`cat /etc/machine-id`',' /etc/update-manager/meta-release || true" ); - auto res = CalamaresUtils::System::instance()->runCommand( - CalamaresUtils::System::RunLocation::RunInTarget, - QStringList { QStringLiteral( "/bin/sh" ) }, - QString(), // Working dir - script, // standard input - std::chrono::seconds( 1 ) ); + auto res = CalamaresUtils::System::instance()->runCommand( CalamaresUtils::System::RunLocation::RunInTarget, + QStringList { QStringLiteral( "/bin/sh" ) }, + QString(), // Working dir + script, // standard input + std::chrono::seconds( 1 ) ); int r = res.first; if ( r == 0 ) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index d206a20a3..c9234d01c 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -45,27 +45,33 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) // Each "panel" of configuration has the same kind of setup, // where the xButton and xCheckBox is connected to the xTracking // configuration object; that takes macro-trickery, unfortunately. -#define trackingSetup(x) { \ - connect( ui->x ## CheckBox, &QCheckBox::stateChanged, \ - this, &TrackingPage::buttonChecked ); \ - connect( ui->x ## CheckBox, &QCheckBox::stateChanged, \ - config->x ## Tracking(), QOverload::of( &TrackingStyleConfig::setTracking ) ); \ - connect( config->x ## Tracking(), &TrackingStyleConfig::trackingChanged, \ - this, [ this, config ]() { this->trackerChanged( config->x ## Tracking(), this->ui->x ## Group, this->ui->x ## CheckBox);} ); \ - connect( ui->x ## PolicyButton, &QAbstractButton::clicked, \ - config, [ config ] { QString url( config->x ## Tracking()->policy() ); if ( !url.isEmpty() ) { QDesktopServices::openUrl( url ); } } ); \ -} +#define trackingSetup( x ) \ + { \ + connect( ui->x##CheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); \ + connect( ui->x##CheckBox, \ + &QCheckBox::stateChanged, \ + config->x##Tracking(), \ + QOverload< bool >::of( &TrackingStyleConfig::setTracking ) ); \ + connect( config->x##Tracking(), &TrackingStyleConfig::trackingChanged, this, [this, config]() { \ + this->trackerChanged( config->x##Tracking(), this->ui->x##Group, this->ui->x##CheckBox ); \ + } ); \ + connect( ui->x##PolicyButton, &QAbstractButton::clicked, config, [config] { \ + QString url( config->x##Tracking()->policy() ); \ + if ( !url.isEmpty() ) \ + { \ + QDesktopServices::openUrl( url ); \ + } \ + } ); \ + } - trackingSetup( install ) - trackingSetup( machine ) - trackingSetup( user ) + trackingSetup( install ) trackingSetup( machine ) trackingSetup( user ) #undef trackingSetup - connect( config, &Config::generalPolicyChanged, [ this ]( const QString& url ) { - this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); - } ); - connect( ui->generalPolicyLabel, &QLabel::linkActivated, [ config ] { + connect( config, &Config::generalPolicyChanged, [this]( const QString& url ) { + this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); + } ); + connect( ui->generalPolicyLabel, &QLabel::linkActivated, [config] { QString url( config->generalPolicy() ); if ( !url.isEmpty() ) { @@ -99,13 +105,15 @@ TrackingPage::retranslate() .arg( product ) ); } -bool TrackingPage::anyOtherChecked() const +bool +TrackingPage::anyOtherChecked() const { - return ui->installCheckBox->isChecked() || ui->machineCheckBox->isChecked() || ui->userCheckBox->isChecked(); + return ui->installCheckBox->isChecked() || ui->machineCheckBox->isChecked() || ui->userCheckBox->isChecked(); } -void TrackingPage::buttonNoneChecked(int state) +void +TrackingPage::buttonNoneChecked( int state ) { if ( state ) { @@ -116,7 +124,8 @@ void TrackingPage::buttonNoneChecked(int state) } } -void TrackingPage::buttonChecked(int state) +void +TrackingPage::buttonChecked( int state ) { if ( state ) { @@ -133,7 +142,7 @@ void TrackingPage::buttonChecked(int state) } void -TrackingPage::trackerChanged(TrackingStyleConfig* config, QWidget* panel, QCheckBox* check) +TrackingPage::trackerChanged( TrackingStyleConfig* config, QWidget* panel, QCheckBox* check ) { panel->setVisible( config->isConfigurable() ); check->setChecked( config->isEnabled() ); diff --git a/src/modules/tracking/TrackingPage.h b/src/modules/tracking/TrackingPage.h index 48599ead4..7df43b846 100644 --- a/src/modules/tracking/TrackingPage.h +++ b/src/modules/tracking/TrackingPage.h @@ -70,7 +70,7 @@ private: * hide the UI parts on the @p panel; otherwise show it * and set @p check state to whether the user has enabled it. */ - void trackerChanged( TrackingStyleConfig* subconfig, QWidget* panel, QCheckBox* check); + void trackerChanged( TrackingStyleConfig* subconfig, QWidget* panel, QCheckBox* check ); Ui::TrackingPage* ui; }; diff --git a/src/modules/tracking/TrackingViewStep.cpp b/src/modules/tracking/TrackingViewStep.cpp index 125d17974..8a80b2b57 100644 --- a/src/modules/tracking/TrackingViewStep.cpp +++ b/src/modules/tracking/TrackingViewStep.cpp @@ -122,4 +122,3 @@ TrackingViewStep::setConfigurationMap( const QVariantMap& configurationMap ) { m_config->setConfigurationMap( configurationMap ); } - From 5623d8086bce1785bb26d505d12c5d5595aeaa28 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 14:27:23 +0200 Subject: [PATCH 47/63] [tracking] Apply coding style - massage trackingSetup macro to look like a function call --- src/modules/tracking/TrackingPage.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index c9234d01c..2dfc6050a 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -46,6 +46,7 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) // where the xButton and xCheckBox is connected to the xTracking // configuration object; that takes macro-trickery, unfortunately. #define trackingSetup( x ) \ + do \ { \ connect( ui->x##CheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); \ connect( ui->x##CheckBox, \ @@ -62,15 +63,17 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) QDesktopServices::openUrl( url ); \ } \ } ); \ - } + } while ( false ) - trackingSetup( install ) trackingSetup( machine ) trackingSetup( user ) + trackingSetup( install ); + trackingSetup( machine ); + trackingSetup( user ); #undef trackingSetup - connect( config, &Config::generalPolicyChanged, [this]( const QString& url ) { - this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); - } ); + connect( config, &Config::generalPolicyChanged, [this]( const QString& url ) { + this->ui->generalPolicyLabel->setVisible( !url.isEmpty() ); + } ); connect( ui->generalPolicyLabel, &QLabel::linkActivated, [config] { QString url( config->generalPolicy() ); if ( !url.isEmpty() ) From 3f55d415e980ef521fd538f5ee9526f53bd91f0c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 14:26:14 +0200 Subject: [PATCH 48/63] [tracking] Make names of user-tracking styles consistent - use kuserfeedback instead of "kde", to name the technology, not the community --- src/modules/tracking/Config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 723465862..51e51e7c8 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -154,7 +154,7 @@ UserTrackingConfig::UserTrackingConfig( QObject* parent ) static bool isValidUserTrackingStyle( const QString& s ) { - static QStringList knownStyles { "kde" }; + static QStringList knownStyles { "kuserfeedback" }; return knownStyles.contains( s ); } From 98ab4330c45143201f4f5ce9202c9e95939383a0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 14:52:48 +0200 Subject: [PATCH 49/63] [tracking] expand documentation of configuration --- src/modules/tracking/tracking.conf | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/modules/tracking/tracking.conf b/src/modules/tracking/tracking.conf index 88d1e7b59..533d0e0dd 100644 --- a/src/modules/tracking/tracking.conf +++ b/src/modules/tracking/tracking.conf @@ -28,7 +28,7 @@ # policy applies. # # Each area has a key *enabled*. If the area is enabled, it is shown to -# the user. This defaults to off, which means no tracking would be +# the user. This defaults to false, which means no tracking would be # configured or enabled by Calamares. # # Each area has a key *policy*, which is a Url to be opened when @@ -53,9 +53,11 @@ # page. You **must** provide policy links per-area as well. policy: "https://github.com/calamares/calamares/wiki/Use-Guide#installation-tracking" -# This is the default level to enable for tracking. If commented out, +# This is the default area to enable for tracking. If commented out, # empty, or otherwise invalid, "none" is used, so no tracking by default. -default: user +# Setting an area here also checks the areas before it (install, machine, +# then user) by default -- subject to those areas being enabled at all. +# default: user # The install area has one specific configuration key: # url: this URL (remember to include the protocol, and prefer https) @@ -73,22 +75,28 @@ default: user install: enabled: false policy: "https://github.com/calamares/calamares/wiki/Use-Guide#installation-tracking" - # url: "https://example.com/install.php?c=$CPU&m=$MEMORY" + url: "https://example.com/install.php?c=$CPU&m=$MEMORY" # The machine area has one specific configuration key: # style: This string specifies what kind of tracking configuration -# needs to be done. There is currently only one valid -# style, "updatemanager", which edits two files in the installed -# system to enable system-tracking. +# needs to be done. See below for valid styles. # -# Per-style documentation: -# - updatemanager replaces the literal string "${MACHINE_ID}" with the contents of +# Available styles: +# - *updatemanager* replaces the literal string "${MACHINE_ID}" with the contents of # /etc/machine-id, in lines starting with "URI" in the file /etc/update-manager/meta-release machine: enabled: false style: updatemanager policy: "https://github.com/calamares/calamares/wiki/Use-Guide#machine-tracking" -# The user area is not yet implemented, and has no specific configuration. +# The user area has one specific configuration key: +# style: This string specifies what kind of tracking configuration +# needs to be done. See below for valid styles. +# +# Available styles: +# - *kuserfeedback* sets up KUserFeedback tracking (applicable to the KDE +# Plasma Desktop) for each KUserFeedback area listed in *areas*. user: enabled: false + style: kuserfeedback + areas: [ PlasmaUserFeedback ] From e834ce532c35931386eb3e50bf3ff9cce2e84d81 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 15:02:01 +0200 Subject: [PATCH 50/63] [libcalamares] Add variant-map getStringList() convenience --- src/libcalamares/utils/Variant.cpp | 16 +++++++++++++++- src/libcalamares/utils/Variant.h | 7 ++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/libcalamares/utils/Variant.cpp b/src/libcalamares/utils/Variant.cpp index cf6ff91fe..dc20e73b2 100644 --- a/src/libcalamares/utils/Variant.cpp +++ b/src/libcalamares/utils/Variant.cpp @@ -1,5 +1,5 @@ /* === This file is part of Calamares - === - * + * * SPDX-FileCopyrightText: 2013-2016 Teo Mrnjavac * SPDX-FileCopyrightText: 2018 Adriaan de Groot * @@ -65,6 +65,20 @@ getString( const QVariantMap& map, const QString& key ) return QString(); } +QStringList +getStringList( const QVariantMap& map, const QString& key ) +{ + if ( map.contains( key ) ) + { + auto v = map.value( key ); + if ( v.type() == QVariant::StringList ) + { + return v.toStringList(); + } + } + return QStringList(); +} + qint64 getInteger( const QVariantMap& map, const QString& key, qint64 d ) { diff --git a/src/libcalamares/utils/Variant.h b/src/libcalamares/utils/Variant.h index a05d281c3..643d8ae98 100644 --- a/src/libcalamares/utils/Variant.h +++ b/src/libcalamares/utils/Variant.h @@ -1,5 +1,5 @@ /* === This file is part of Calamares - === - * + * * SPDX-FileCopyrightText: 2013-2016 Teo Mrnjavac * SPDX-FileCopyrightText: 2018 Adriaan de Groot * @@ -43,6 +43,11 @@ DLLEXPORT bool getBool( const QVariantMap& map, const QString& key, bool d ); */ DLLEXPORT QString getString( const QVariantMap& map, const QString& key ); +/** + * Get a string list from a mapping; returns empty list if no value. + */ +DLLEXPORT QStringList getStringList( const QVariantMap& map, const QString& key ); + /** * Get an integer value from a mapping; returns @p d if no value. */ From 9b8d591b5dc63279d6bcbd9b6ddb3a78cd59d9d6 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 15:11:11 +0200 Subject: [PATCH 51/63] [tracking] Configure user-tracking areas --- src/modules/tracking/Config.cpp | 2 ++ src/modules/tracking/Config.h | 2 ++ src/modules/tracking/TrackingJobs.cpp | 14 ++++++++++---- src/modules/tracking/TrackingJobs.h | 6 ++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/modules/tracking/Config.cpp b/src/modules/tracking/Config.cpp index 51e51e7c8..6d9dbb10b 100644 --- a/src/modules/tracking/Config.cpp +++ b/src/modules/tracking/Config.cpp @@ -165,6 +165,8 @@ UserTrackingConfig::setConfigurationMap( const QVariantMap& configurationMap ) m_userTrackingStyle = CalamaresUtils::getString( configurationMap, "style" ); validate( m_userTrackingStyle, isValidUserTrackingStyle ); + + m_userTrackingAreas = CalamaresUtils::getStringList( configurationMap, "areas" ); } diff --git a/src/modules/tracking/Config.h b/src/modules/tracking/Config.h index 0bdff260a..fb279ea93 100644 --- a/src/modules/tracking/Config.h +++ b/src/modules/tracking/Config.h @@ -149,9 +149,11 @@ public: void setConfigurationMap( const QVariantMap& configurationMap ); QString userTrackingStyle() { return m_userTrackingStyle; } + QStringList userTrackingAreas() const { return m_userTrackingAreas; } private: QString m_userTrackingStyle; + QStringList m_userTrackingAreas; // fine-grained areas }; class Config : public QObject diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index cd885194c..35d51ce64 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -169,7 +169,8 @@ TrackingUserJob::addJob( Calamares::JobList& list, UserTrackingConfig* config ) const auto style = config->userTrackingStyle(); if ( style == "kuserfeedback" ) { - list.append( Calamares::job_ptr( new TrackingKUserFeedbackJob() ) ); + list.append( + Calamares::job_ptr( new TrackingKUserFeedbackJob( QString( "root" ), config->userTrackingAreas() ) ) ); } else { @@ -178,6 +179,12 @@ TrackingUserJob::addJob( Calamares::JobList& list, UserTrackingConfig* config ) } } +TrackingKUserFeedbackJob::TrackingKUserFeedbackJob( const QString& username, const QStringList& areas ) + : m_username( username ) + , m_areas( areas ) +{ +} + QString TrackingKUserFeedbackJob::prettyName() const { @@ -206,10 +213,9 @@ TrackingKUserFeedbackJob::exec() FeedbackLevel=16 )x"; - for ( const QString& area : QStringList { "PlasmaUserFeedback" } ) + for ( const QString& area : m_areas ) { - // TODO: get the configured user name - QString path = QStringLiteral( "/home/%1/.config/%2" ).arg( QString(), area ); + QString path = QStringLiteral( "/home/%1/.config/%2" ).arg( m_username, area ); cDebug() << "Configuring KUserFeedback" << path; int r = CalamaresUtils::System::instance()->createTargetFile( path, config ); diff --git a/src/modules/tracking/TrackingJobs.h b/src/modules/tracking/TrackingJobs.h index dd5ca6b92..c65c8f621 100644 --- a/src/modules/tracking/TrackingJobs.h +++ b/src/modules/tracking/TrackingJobs.h @@ -114,10 +114,16 @@ public: class TrackingKUserFeedbackJob : public Calamares::Job { public: + TrackingKUserFeedbackJob( const QString& username, const QStringList& areas ); + QString prettyName() const override; QString prettyDescription() const override; QString prettyStatusMessage() const override; Calamares::JobResult exec() override; + +private: + QString m_username; + QStringList m_areas; }; #endif From 47b0fa5d55f4a9f44089c3c4dba3c06fbbe2d317 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 15:24:21 +0200 Subject: [PATCH 52/63] [tracking] Get username from gs --- src/modules/tracking/TrackingJobs.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/modules/tracking/TrackingJobs.cpp b/src/modules/tracking/TrackingJobs.cpp index 35d51ce64..2087804ec 100644 --- a/src/modules/tracking/TrackingJobs.cpp +++ b/src/modules/tracking/TrackingJobs.cpp @@ -20,6 +20,8 @@ #include "Config.h" +#include "GlobalStorage.h" +#include "JobQueue.h" #include "network/Manager.h" #include "utils/CalamaresUtilsSystem.h" #include "utils/Logger.h" @@ -166,11 +168,20 @@ TrackingUserJob::addJob( Calamares::JobList& list, UserTrackingConfig* config ) { if ( config->isEnabled() ) { + const auto* gs = Calamares::JobQueue::instance()->globalStorage(); + static const auto key = QStringLiteral( "username" ); + QString username = ( gs && gs->contains( key ) ) ? gs->value( key ).toString() : QString(); + + if ( username.isEmpty() ) + { + cWarning() << "No username is set in GlobalStorage, skipping user-tracking."; + return; + } + const auto style = config->userTrackingStyle(); if ( style == "kuserfeedback" ) { - list.append( - Calamares::job_ptr( new TrackingKUserFeedbackJob( QString( "root" ), config->userTrackingAreas() ) ) ); + list.append( Calamares::job_ptr( new TrackingKUserFeedbackJob( username, config->userTrackingAreas() ) ) ); } else { From 8ad221311d64d2469bf22fa03c73961f9c3be995 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Wed, 17 Jun 2020 15:31:53 +0200 Subject: [PATCH 53/63] [tracking] Can't uncheck 'none' box by itself - If the 'no tracking' box is checked, then the way to uncheck it is to tick some **other** box. - It doesn't make sense to unselect 'none' and then have .. none selected. --- src/modules/tracking/TrackingPage.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp index 2dfc6050a..618e1bc8f 100644 --- a/src/modules/tracking/TrackingPage.cpp +++ b/src/modules/tracking/TrackingPage.cpp @@ -40,6 +40,7 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) CALAMARES_RETRANSLATE_SLOT( &TrackingPage::retranslate ); ui->noneCheckBox->setChecked( true ); + ui->noneCheckBox->setEnabled( false ); connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonNoneChecked ); // Each "panel" of configuration has the same kind of setup, @@ -124,6 +125,7 @@ TrackingPage::buttonNoneChecked( int state ) ui->installCheckBox->setChecked( false ); ui->machineCheckBox->setChecked( false ); ui->userCheckBox->setChecked( false ); + ui->noneCheckBox->setEnabled( false ); } } @@ -133,6 +135,7 @@ TrackingPage::buttonChecked( int state ) if ( state ) { // Can't have none checked, if another one is + ui->noneCheckBox->setEnabled( true ); ui->noneCheckBox->setChecked( false ); } else @@ -140,6 +143,7 @@ TrackingPage::buttonChecked( int state ) if ( !anyOtherChecked() ) { ui->noneCheckBox->setChecked( true ); + ui->noneCheckBox->setEnabled( false ); } } } From fc91b4ce602bbf08cbe8162df2086205f21c471f Mon Sep 17 00:00:00 2001 From: demmm Date: Wed, 17 Jun 2020 16:52:59 +0200 Subject: [PATCH 54/63] [localeq] use js to get the hasInternet status switching between Map.qml & Offline.qml now happens properly --- src/modules/localeq/localeq.qml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/modules/localeq/localeq.qml b/src/modules/localeq/localeq.qml index 0abdebfc9..ffd87f5b5 100644 --- a/src/modules/localeq/localeq.qml +++ b/src/modules/localeq/localeq.qml @@ -34,6 +34,32 @@ Page { //Needs to come from .conf/geoip property var hasInternet: true + function getInt(format) { + var requestURL = "https://example.org/"; + var xhr = new XMLHttpRequest; + + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + + if (xhr.status !== 200) { + console.log("Disconnected!!"); + var connected = false + hasInternet = connected + return; + } + + else { + console.log("Connected!!"); + } + } + } + xhr.open("GET", requestURL, true); + xhr.send(); + } + Component.onCompleted: { + getInt(); + } + Loader { id: image anchors.horizontalCenter: parent.horizontalCenter From 1b11cc90c43e1d31af444c2e585be79d02e2ab80 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 18 Jun 2020 13:37:43 +0200 Subject: [PATCH 55/63] [tracking] Polish the phrase for 'none' a bit --- src/modules/tracking/page_trackingstep.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/tracking/page_trackingstep.ui b/src/modules/tracking/page_trackingstep.ui index 4383d312d..55a4df094 100644 --- a/src/modules/tracking/page_trackingstep.ui +++ b/src/modules/tracking/page_trackingstep.ui @@ -69,7 +69,7 @@ margin-left: 2em; - <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> + <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> true From b9b79f11a418ba251bfa08e19032448e7117b0e4 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 18 Jun 2020 14:47:33 +0200 Subject: [PATCH 56/63] [unpackfs] Prevent accidental 0777 permissions on / FIXES #1418 --- src/modules/unpackfs/main.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py index ace289092..00de4165d 100644 --- a/src/modules/unpackfs/main.py +++ b/src/modules/unpackfs/main.py @@ -388,6 +388,22 @@ def get_supported_filesystems(): return ["file"] + get_supported_filesystems_kernel() +def repair_root_permissions(root_mount_point): + """ + If the / of the system gets permission 777, change it down + to 755. Any other permission is left alone. This + works around standard behavior from squashfs where + permissions are (easily, accidentally) set to 777. + """ + existing_root_mode = os.stat(root_mount_point).st_mode & 0o777 + if existing_root_mode == 0o777: + try: + os.chmod(root_mount_point, 0o755) # Want / to be rwxr-xr-x + except OSError as e: + utils.warning("Could not set / to safe permissions: {}".format(e)) + # But ignore it + + def run(): """ Unsquash filesystem. @@ -457,6 +473,9 @@ def run(): is_first = False - unpackop = UnpackOperation(unpack) - - return unpackop.run() + repair_root_permissions(root_mount_point) + try: + unpackop = UnpackOperation(unpack) + return unpackop.run() + finally: + repair_root_permissions(root_mount_point) From b2fcc61987ae6759cf7ed1bfe645c6ee41cddfc5 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 18 Jun 2020 14:53:19 +0200 Subject: [PATCH 57/63] Changes: pre-release housekeeping --- CHANGES | 2 +- CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index c14167de5..82b70f9af 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,7 @@ 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.26 (unreleased) # +# 3.2.26 (2020-06-18) # This release contains contributions from (alphabetically by first name): - Anke Boersma diff --git a/CMakeLists.txt b/CMakeLists.txt index 9795da8ae..aa5ced95b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,7 +49,7 @@ project( CALAMARES VERSION 3.2.26 LANGUAGES C CXX ) -set( CALAMARES_VERSION_RC 1 ) # Set to 0 during release cycle, 1 during development +set( CALAMARES_VERSION_RC 0 ) # Set to 0 during release cycle, 1 during development ### OPTIONS # From 0155d051aabbef8420a9bfb53d43dd1d6c8c0b12 Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 18 Jun 2020 14:54:44 +0200 Subject: [PATCH 58/63] i18n: [calamares] Automatic merge of Transifex translations --- lang/calamares_az.ts | 3827 +++++++++++++++++++++++++++++++++++++++ lang/calamares_az_AZ.ts | 3827 +++++++++++++++++++++++++++++++++++++++ lang/calamares_hi.ts | 330 ++-- 3 files changed, 7836 insertions(+), 148 deletions(-) create mode 100644 lang/calamares_az.ts create mode 100644 lang/calamares_az_AZ.ts diff --git a/lang/calamares_az.ts b/lang/calamares_az.ts new file mode 100644 index 000000000..fc250af64 --- /dev/null +++ b/lang/calamares_az.ts @@ -0,0 +1,3827 @@ + + + + + BootInfoWidget + + + The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. + + + + + This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. + + + + + This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. + + + + + BootLoaderModel + + + Master Boot Record of %1 + + + + + Boot Partition + + + + + System Partition + + + + + Do not install a boot loader + + + + + %1 (%2) + + + + + Calamares::BlankViewStep + + + Blank Page + + + + + Calamares::DebugWindow + + + Form + + + + + GlobalStorage + + + + + JobQueue + + + + + Modules + + + + + Type: + + + + + + none + + + + + Interface: + + + + + Tools + + + + + Reload Stylesheet + + + + + Widget Tree + + + + + Debug information + + + + + Calamares::ExecutionViewStep + + + Set up + + + + + Install + + + + + Calamares::FailJob + + + Job failed (%1) + + + + + Programmed job failure was explicitly requested. + + + + + Calamares::JobThread + + + Done + + + + + Calamares::NamedJob + + + Example job (%1) + + + + + Calamares::ProcessJob + + + Run command '%1' in target system. + + + + + Run command '%1'. + + + + + Running command %1 %2 + + + + + Calamares::PythonJob + + + Running %1 operation. + + + + + Bad working directory path + + + + + Working directory %1 for python job %2 is not readable. + + + + + Bad main script file + + + + + Main script file %1 for python job %2 is not readable. + + + + + Boost.Python error in job "%1". + + + + + Calamares::QmlViewStep + + + Loading ... + + + + + QML Step <i>%1</i>. + + + + + Loading failed. + + + + + Calamares::RequirementsChecker + + + Waiting for %n module(s). + + + + + + + + (%n second(s)) + + + + + + + + System-requirements checking is complete. + + + + + Calamares::ViewManager + + + Setup Failed + + + + + Installation Failed + + + + + Would you like to paste the install log to the web? + + + + + Error + + + + + + &Yes + + + + + + &No + + + + + &Close + + + + + Install Log Paste URL + + + + + The upload was unsuccessful. No web-paste was done. + + + + + Calamares Initialization Failed + + + + + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. + + + + + <br/>The following modules could not be loaded: + + + + + Continue with setup? + + + + + Continue with installation? + + + + + The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> + + + + + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> + + + + + &Set up now + + + + + &Install now + + + + + Go &back + + + + + &Set up + + + + + &Install + + + + + Setup is complete. Close the setup program. + + + + + The installation is complete. Close the installer. + + + + + Cancel setup without changing the system. + + + + + Cancel installation without changing the system. + + + + + &Next + + + + + &Back + + + + + &Done + + + + + &Cancel + + + + + Cancel setup? + + + + + Cancel installation? + + + + + Do you really want to cancel the current setup process? +The setup program will quit and all changes will be lost. + + + + + Do you really want to cancel the current install process? +The installer will quit and all changes will be lost. + + + + + CalamaresPython::Helper + + + Unknown exception type + + + + + unparseable Python error + + + + + unparseable Python traceback + + + + + Unfetchable Python error. + + + + + CalamaresUtils + + + Install log posted to: +%1 + + + + + CalamaresWindow + + + Show debug information + + + + + &Back + + + + + &Next + + + + + &Cancel + + + + + %1 Setup Program + + + + + %1 Installer + + + + + CheckerContainer + + + Gathering system information... + + + + + ChoicePage + + + Form + + + + + Select storage de&vice: + + + + + + + + Current: + + + + + After: + + + + + <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Having a GPT partition table and <strong>fat32 512Mb /boot partition is a must for UEFI installs</strong>, either use an existing without formatting or create one. + + + + + Reuse %1 as home partition for %2. + + + + + <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> + + + + + %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. + + + + + Boot loader location: + + + + + <strong>Select a partition to install on</strong> + + + + + An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. + + + + + The EFI system partition at %1 will be used for starting %2. + + + + + EFI system partition: + + + + + This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + + + + <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. + + + + + + + + <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. + + + + + + + + <strong>Replace a partition</strong><br/>Replaces a partition with %1. + + + + + This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + No Swap + + + + + Reuse Swap + + + + + Swap (no Hibernate) + + + + + Swap (with Hibernate) + + + + + Swap to file + + + + + ClearMountsJob + + + Clear mounts for partitioning operations on %1 + + + + + Clearing mounts for partitioning operations on %1. + + + + + Cleared all mounts for %1 + + + + + ClearTempMountsJob + + + Clear all temporary mounts. + + + + + Clearing all temporary mounts. + + + + + Cannot get list of temporary mounts. + + + + + Cleared all temporary mounts. + + + + + CommandList + + + + Could not run command. + + + + + The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. + + + + + The command needs to know the user's name, but no username is defined. + + + + + Config + + + Set keyboard model to %1.<br/> + + + + + Set keyboard layout to %1/%2. + + + + + The system language will be set to %1. + + + + + The numbers and dates locale will be set to %1. + + + + + Set timezone to %1/%2.<br/> + + + + + Network Installation. (Disabled: Incorrect configuration) + + + + + Network Installation. (Disabled: Received invalid groups data) + + + + + Network Installation. (Disabled: internal error) + + + + + Network Installation. (Disabled: Unable to fetch package lists, check your network connection) + + + + + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. + + + + + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. + + + + + This program will ask you some questions and set up %2 on your computer. + + + + + <h1>Welcome to the Calamares setup program for %1.</h1> + + + + + <h1>Welcome to %1 setup.</h1> + + + + + <h1>Welcome to the Calamares installer for %1.</h1> + + + + + <h1>Welcome to the %1 installer.</h1> + + + + + ContextualProcessJob + + + Contextual Processes Job + + + + + CreatePartitionDialog + + + Create a Partition + + + + + Si&ze: + + + + + MiB + + + + + Partition &Type: + + + + + &Primary + + + + + E&xtended + + + + + Fi&le System: + + + + + LVM LV name + + + + + &Mount Point: + + + + + Flags: + + + + + En&crypt + + + + + Logical + + + + + Primary + + + + + GPT + + + + + Mountpoint already in use. Please select another one. + + + + + CreatePartitionJob + + + Create new %2MiB partition on %4 (%3) with file system %1. + + + + + Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. + + + + + Creating new %1 partition on %2. + + + + + The installer failed to create partition on disk '%1'. + + + + + CreatePartitionTableDialog + + + Create Partition Table + + + + + Creating a new partition table will delete all existing data on the disk. + + + + + What kind of partition table do you want to create? + + + + + Master Boot Record (MBR) + + + + + GUID Partition Table (GPT) + + + + + CreatePartitionTableJob + + + Create new %1 partition table on %2. + + + + + Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). + + + + + Creating new %1 partition table on %2. + + + + + The installer failed to create a partition table on %1. + + + + + CreateUserJob + + + Create user %1 + + + + + Create user <strong>%1</strong>. + + + + + Creating user %1. + + + + + Sudoers dir is not writable. + + + + + Cannot create sudoers file for writing. + + + + + Cannot chmod sudoers file. + + + + + Cannot open groups file for reading. + + + + + CreateVolumeGroupDialog + + + Create Volume Group + + + + + CreateVolumeGroupJob + + + Create new volume group named %1. + + + + + Create new volume group named <strong>%1</strong>. + + + + + Creating new volume group named %1. + + + + + The installer failed to create a volume group named '%1'. + + + + + DeactivateVolumeGroupJob + + + + Deactivate volume group named %1. + + + + + Deactivate volume group named <strong>%1</strong>. + + + + + The installer failed to deactivate a volume group named %1. + + + + + DeletePartitionJob + + + Delete partition %1. + + + + + Delete partition <strong>%1</strong>. + + + + + Deleting partition %1. + + + + + The installer failed to delete partition %1. + + + + + DeviceInfoWidget + + + This device has a <strong>%1</strong> partition table. + + + + + This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. + + + + + This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. + + + + + <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. + + + + + <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. + + + + + The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. + + + + + DeviceModel + + + %1 - %2 (%3) + device[name] - size[number] (device-node[name]) + + + + + %1 - (%2) + device[name] - (device-node[name]) + + + + + DracutLuksCfgJob + + + Write LUKS configuration for Dracut to %1 + + + + + Skip writing LUKS configuration for Dracut: "/" partition is not encrypted + + + + + Failed to open %1 + + + + + DummyCppJob + + + Dummy C++ Job + + + + + EditExistingPartitionDialog + + + Edit Existing Partition + + + + + Content: + + + + + &Keep + + + + + Format + + + + + Warning: Formatting the partition will erase all existing data. + + + + + &Mount Point: + + + + + Si&ze: + + + + + MiB + + + + + Fi&le System: + + + + + Flags: + + + + + Mountpoint already in use. Please select another one. + + + + + EncryptWidget + + + Form + + + + + En&crypt system + + + + + Passphrase + + + + + Confirm passphrase + + + + + Please enter the same passphrase in both boxes. + + + + + FillGlobalStorageJob + + + Set partition information + + + + + Install %1 on <strong>new</strong> %2 system partition. + + + + + Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. + + + + + Install %2 on %3 system partition <strong>%1</strong>. + + + + + Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. + + + + + Install boot loader on <strong>%1</strong>. + + + + + Setting up mount points. + + + + + FinishedPage + + + Form + + + + + &Restart now + + + + + <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. + + + + + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> + + + + + <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. + + + + + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> + + + + + <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. + + + + + <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. + + + + + FinishedViewStep + + + Finish + + + + + Setup Complete + + + + + Installation Complete + + + + + The setup of %1 is complete. + + + + + The installation of %1 is complete. + + + + + FormatPartitionJob + + + Format partition %1 (file system: %2, size: %3 MiB) on %4. + + + + + Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. + + + + + Formatting partition %1 with file system %2. + + + + + The installer failed to format partition %1 on disk '%2'. + + + + + GeneralRequirements + + + has at least %1 GiB available drive space + + + + + There is not enough drive space. At least %1 GiB is required. + + + + + has at least %1 GiB working memory + + + + + The system does not have enough working memory. At least %1 GiB is required. + + + + + is plugged in to a power source + + + + + The system is not plugged in to a power source. + + + + + is connected to the Internet + + + + + The system is not connected to the Internet. + + + + + is running the installer as an administrator (root) + + + + + The setup program is not running with administrator rights. + + + + + The installer is not running with administrator rights. + + + + + has a screen large enough to show the whole installer + + + + + The screen is too small to display the setup program. + + + + + The screen is too small to display the installer. + + + + + HostInfoJob + + + Collecting information about your machine. + + + + + IDJob + + + + + + OEM Batch Identifier + + + + + Could not create directories <code>%1</code>. + + + + + Could not open file <code>%1</code>. + + + + + Could not write to file <code>%1</code>. + + + + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + + + InteractiveTerminalPage + + + Konsole not installed + + + + + Please install KDE Konsole and try again! + + + + + Executing script: &nbsp;<code>%1</code> + + + + + InteractiveTerminalViewStep + + + Script + + + + + KeyboardPage + + + Set keyboard model to %1.<br/> + + + + + Set keyboard layout to %1/%2. + + + + + KeyboardQmlViewStep + + + Keyboard + + + + + KeyboardViewStep + + + Keyboard + + + + + LCLocaleDialog + + + System locale setting + + + + + The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. + + + + + &Cancel + + + + + &OK + + + + + LicensePage + + + Form + + + + + <h1>License Agreement</h1> + + + + + I accept the terms and conditions above. + + + + + Please review the End User License Agreements (EULAs). + + + + + This setup procedure will install proprietary software that is subject to licensing terms. + + + + + If you do not agree with the terms, the setup procedure cannot continue. + + + + + This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. + + + + + If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. + + + + + LicenseViewStep + + + License + + + + + LicenseWidget + + + URL: %1 + + + + + <strong>%1 driver</strong><br/>by %2 + %1 is an untranslatable product name, example: Creative Audigy driver + + + + + <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> + %1 is usually a vendor name, example: Nvidia graphics driver + + + + + <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1 codec</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1 package</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1</strong><br/><font color="Grey">by %2</font> + + + + + File: %1 + + + + + Hide license text + + + + + Show the license text + + + + + Open license agreement in browser. + + + + + LocalePage + + + Region: + + + + + Zone: + + + + + + &Change... + + + + + The system language will be set to %1. + + + + + The numbers and dates locale will be set to %1. + + + + + Set timezone to %1/%2.<br/> + + + + + LocaleQmlViewStep + + + Location + + + + + LocaleViewStep + + + Location + + + + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could not configure LUKS key file on partition %1. + + + + + MachineIdJob + + + Generate machine-id. + + + + + Configuration Error + + + + + No root mount point is set for MachineId. + + + + + NetInstallViewStep + + + + Package selection + + + + + Office software + + + + + Office package + + + + + Browser software + + + + + Browser package + + + + + Web browser + + + + + Kernel + + + + + Services + + + + + Login + + + + + Desktop + + + + + Applications + + + + + Communication + + + + + Development + + + + + Office + + + + + Multimedia + + + + + Internet + + + + + Theming + + + + + Gaming + + + + + Utilities + + + + + NotesQmlViewStep + + + Notes + + + + + OEMPage + + + Ba&tch: + + + + + <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> + + + + + <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> + + + + + OEMViewStep + + + OEM Configuration + + + + + Set the OEM Batch Identifier to <code>%1</code>. + + + + + PWQ + + + Password is too short + + + + + Password is too long + + + + + Password is too weak + + + + + Memory allocation error when setting '%1' + + + + + Memory allocation error + + + + + The password is the same as the old one + + + + + The password is a palindrome + + + + + The password differs with case changes only + + + + + The password is too similar to the old one + + + + + The password contains the user name in some form + + + + + The password contains words from the real name of the user in some form + + + + + The password contains forbidden words in some form + + + + + The password contains less than %1 digits + + + + + The password contains too few digits + + + + + The password contains less than %1 uppercase letters + + + + + The password contains too few uppercase letters + + + + + The password contains less than %1 lowercase letters + + + + + The password contains too few lowercase letters + + + + + The password contains less than %1 non-alphanumeric characters + + + + + The password contains too few non-alphanumeric characters + + + + + The password is shorter than %1 characters + + + + + The password is too short + + + + + The password is just rotated old one + + + + + The password contains less than %1 character classes + + + + + The password does not contain enough character classes + + + + + The password contains more than %1 same characters consecutively + + + + + The password contains too many same characters consecutively + + + + + The password contains more than %1 characters of the same class consecutively + + + + + The password contains too many characters of the same class consecutively + + + + + The password contains monotonic sequence longer than %1 characters + + + + + The password contains too long of a monotonic character sequence + + + + + No password supplied + + + + + Cannot obtain random numbers from the RNG device + + + + + Password generation failed - required entropy too low for settings + + + + + The password fails the dictionary check - %1 + + + + + The password fails the dictionary check + + + + + Unknown setting - %1 + + + + + Unknown setting + + + + + Bad integer value of setting - %1 + + + + + Bad integer value + + + + + Setting %1 is not of integer type + + + + + Setting is not of integer type + + + + + Setting %1 is not of string type + + + + + Setting is not of string type + + + + + Opening the configuration file failed + + + + + The configuration file is malformed + + + + + Fatal failure + + + + + Unknown error + + + + + Password is empty + + + + + PackageChooserPage + + + Form + + + + + Product Name + + + + + TextLabel + + + + + Long Product Description + + + + + Package Selection + + + + + Please pick a product from the list. The selected product will be installed. + + + + + PackageChooserViewStep + + + Packages + + + + + PackageModel + + + Name + + + + + Description + + + + + Page_Keyboard + + + Form + + + + + Keyboard Model: + + + + + Type here to test your keyboard + + + + + Page_UserSetup + + + Form + + + + + What is your name? + + + + + Your Full Name + + + + + What name do you want to use to log in? + + + + + login + + + + + What is the name of this computer? + + + + + <small>This name will be used if you make the computer visible to others on a network.</small> + + + + + Computer Name + + + + + Choose a password to keep your account safe. + + + + + + <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> + + + + + + Password + + + + + + Repeat Password + + + + + When this box is checked, password-strength checking is done and you will not be able to use a weak password. + + + + + Require strong passwords. + + + + + Log in automatically without asking for the password. + + + + + Use the same password for the administrator account. + + + + + Choose a password for the administrator account. + + + + + + <small>Enter the same password twice, so that it can be checked for typing errors.</small> + + + + + PartitionLabelsView + + + Root + + + + + Home + + + + + Boot + + + + + EFI system + + + + + Swap + + + + + New partition for %1 + + + + + New partition + + + + + %1 %2 + size[number] filesystem[name] + + + + + PartitionModel + + + + Free Space + + + + + + New partition + + + + + Name + + + + + File System + + + + + Mount Point + + + + + Size + + + + + PartitionPage + + + Form + + + + + Storage de&vice: + + + + + &Revert All Changes + + + + + New Partition &Table + + + + + Cre&ate + + + + + &Edit + + + + + &Delete + + + + + New Volume Group + + + + + Resize Volume Group + + + + + Deactivate Volume Group + + + + + Remove Volume Group + + + + + I&nstall boot loader on: + + + + + Are you sure you want to create a new partition table on %1? + + + + + Can not create new partition + + + + + The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. + + + + + PartitionViewStep + + + Gathering system information... + + + + + Partitions + + + + + Install %1 <strong>alongside</strong> another operating system. + + + + + <strong>Erase</strong> disk and install %1. + + + + + <strong>Replace</strong> a partition with %1. + + + + + <strong>Manual</strong> partitioning. + + + + + Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). + + + + + <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. + + + + + <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. + + + + + <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). + + + + + Disk <strong>%1</strong> (%2) + + + + + Current: + + + + + After: + + + + + No EFI system partition configured + + + + + An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. + + + + + An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. + + + + + EFI system partition flag not set + + + + + Option to use GPT on BIOS + + + + + A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>bios_grub</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. + + + + + Boot partition not encrypted + + + + + A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. + + + + + has at least one disk device available. + + + + + There are no partitions to install on. + + + + + PlasmaLnfJob + + + Plasma Look-and-Feel Job + + + + + + Could not select KDE Plasma Look-and-Feel package + + + + + PlasmaLnfPage + + + Form + + + + + Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. + + + + + Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. + + + + + PlasmaLnfViewStep + + + Look-and-Feel + + + + + PreserveFiles + + + Saving files for later ... + + + + + No files configured to save for later. + + + + + Not all of the configured files could be preserved. + + + + + ProcessResult + + + +There was no output from the command. + + + + + +Output: + + + + + + External command crashed. + + + + + Command <i>%1</i> crashed. + + + + + External command failed to start. + + + + + Command <i>%1</i> failed to start. + + + + + Internal error when starting command. + + + + + Bad parameters for process job call. + + + + + External command failed to finish. + + + + + Command <i>%1</i> failed to finish in %2 seconds. + + + + + External command finished with errors. + + + + + Command <i>%1</i> finished with exit code %2. + + + + + QObject + + + %1 (%2) + + + + + Requirements checking for module <i>%1</i> is complete. + + + + + unknown + + + + + extended + + + + + unformatted + + + + + swap + + + + + Default Keyboard Model + + + + + + Default + + + + + + + + File not found + + + + + Path <pre>%1</pre> must be an absolute path. + + + + + Could not create new random file <pre>%1</pre>. + + + + + No product + + + + + No description provided. + + + + + (no mount point) + + + + + Unpartitioned space or unknown partition table + + + + + RemoveUserJob + + + Remove live user from target system + + + + + RemoveVolumeGroupJob + + + + Remove Volume Group named %1. + + + + + Remove Volume Group named <strong>%1</strong>. + + + + + The installer failed to remove a volume group named '%1'. + + + + + ReplaceWidget + + + Form + + + + + Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. + + + + + The selected item does not appear to be a valid partition. + + + + + %1 cannot be installed on empty space. Please select an existing partition. + + + + + %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. + + + + + %1 cannot be installed on this partition. + + + + + Data partition (%1) + + + + + Unknown system partition (%1) + + + + + %1 system partition (%2) + + + + + <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. + + + + + <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. + + + + + + + <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. + + + + + The EFI system partition at %1 will be used for starting %2. + + + + + EFI system partition: + + + + + ResizeFSJob + + + Resize Filesystem Job + + + + + Invalid configuration + + + + + The file-system resize job has an invalid configuration and will not run. + + + + + KPMCore not Available + + + + + Calamares cannot start KPMCore for the file-system resize job. + + + + + + + + + Resize Failed + + + + + The filesystem %1 could not be found in this system, and cannot be resized. + + + + + The device %1 could not be found in this system, and cannot be resized. + + + + + + The filesystem %1 cannot be resized. + + + + + + The device %1 cannot be resized. + + + + + The filesystem %1 must be resized, but cannot. + + + + + The device %1 must be resized, but cannot + + + + + ResizePartitionJob + + + Resize partition %1. + + + + + Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>. + + + + + Resizing %2MiB partition %1 to %3MiB. + + + + + The installer failed to resize partition %1 on disk '%2'. + + + + + ResizeVolumeGroupDialog + + + Resize Volume Group + + + + + ResizeVolumeGroupJob + + + + Resize volume group named %1 from %2 to %3. + + + + + Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. + + + + + The installer failed to resize a volume group named '%1'. + + + + + ResultsListDialog + + + For best results, please ensure that this computer: + + + + + System requirements + + + + + ResultsListWidget + + + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. + + + + + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. + + + + + This program will ask you some questions and set up %2 on your computer. + + + + + ScanningDialog + + + Scanning storage devices... + + + + + Partitioning + + + + + SetHostNameJob + + + Set hostname %1 + + + + + Set hostname <strong>%1</strong>. + + + + + Setting hostname %1. + + + + + + Internal Error + + + + + + Cannot write hostname to target system + + + + + SetKeyboardLayoutJob + + + Set keyboard model to %1, layout to %2-%3 + + + + + Failed to write keyboard configuration for the virtual console. + + + + + + + Failed to write to %1 + + + + + Failed to write keyboard configuration for X11. + + + + + Failed to write keyboard configuration to existing /etc/default directory. + + + + + SetPartFlagsJob + + + Set flags on partition %1. + + + + + Set flags on %1MiB %2 partition. + + + + + Set flags on new partition. + + + + + Clear flags on partition <strong>%1</strong>. + + + + + Clear flags on %1MiB <strong>%2</strong> partition. + + + + + Clear flags on new partition. + + + + + Flag partition <strong>%1</strong> as <strong>%2</strong>. + + + + + Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>. + + + + + Flag new partition as <strong>%1</strong>. + + + + + Clearing flags on partition <strong>%1</strong>. + + + + + Clearing flags on %1MiB <strong>%2</strong> partition. + + + + + Clearing flags on new partition. + + + + + Setting flags <strong>%2</strong> on partition <strong>%1</strong>. + + + + + Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition. + + + + + Setting flags <strong>%1</strong> on new partition. + + + + + The installer failed to set flags on partition %1. + + + + + SetPasswordJob + + + Set password for user %1 + + + + + Setting password for user %1. + + + + + Bad destination system path. + + + + + rootMountPoint is %1 + + + + + Cannot disable root account. + + + + + passwd terminated with error code %1. + + + + + Cannot set password for user %1. + + + + + usermod terminated with error code %1. + + + + + SetTimezoneJob + + + Set timezone to %1/%2 + + + + + Cannot access selected timezone path. + + + + + Bad path: %1 + + + + + Cannot set timezone. + + + + + Link creation failed, target: %1; link name: %2 + + + + + Cannot set timezone, + + + + + Cannot open /etc/timezone for writing + + + + + ShellProcessJob + + + Shell Processes Job + + + + + SlideCounter + + + %L1 / %L2 + slide counter, %1 of %2 (numeric) + + + + + SummaryPage + + + This is an overview of what will happen once you start the setup procedure. + + + + + This is an overview of what will happen once you start the install procedure. + + + + + SummaryViewStep + + + Summary + + + + + TrackingInstallJob + + + Installation feedback + + + + + Sending installation feedback. + + + + + Internal error in install-tracking. + + + + + HTTP request timed out. + + + + + TrackingMachineNeonJob + + + Machine feedback + + + + + Configuring machine feedback. + + + + + + Error in machine feedback configuration. + + + + + Could not configure machine feedback correctly, script error %1. + + + + + Could not configure machine feedback correctly, Calamares error %1. + + + + + TrackingPage + + + Form + + + + + Placeholder + + + + + <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> + + + + + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> + + + + + Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. + + + + + By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. + + + + + By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. + + + + + By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. + + + + + TrackingViewStep + + + Feedback + + + + + UsersPage + + + <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> + + + + + <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> + + + + + Your username is too long. + + + + + Your username must start with a lowercase letter or underscore. + + + + + Only lowercase letters, numbers, underscore and hyphen are allowed. + + + + + Your hostname is too short. + + + + + Your hostname is too long. + + + + + Only letters, numbers, underscore and hyphen are allowed. + + + + + Your passwords do not match! + + + + + UsersViewStep + + + Users + + + + + VariantModel + + + Key + + + + + Value + + + + + VolumeGroupBaseDialog + + + Create Volume Group + + + + + List of Physical Volumes + + + + + Volume Group Name: + + + + + Volume Group Type: + + + + + Physical Extent Size: + + + + + MiB + + + + + Total Size: + + + + + Used Size: + + + + + Total Sectors: + + + + + Quantity of LVs: + + + + + WelcomePage + + + Form + + + + + + Select application and system language + + + + + &About + + + + + Open donations website + + + + + &Donate + + + + + Open help and support website + + + + + &Support + + + + + Open issues and bug-tracking website + + + + + &Known issues + + + + + Open release notes website + + + + + &Release notes + + + + + <h1>Welcome to the Calamares setup program for %1.</h1> + + + + + <h1>Welcome to %1 setup.</h1> + + + + + <h1>Welcome to the Calamares installer for %1.</h1> + + + + + <h1>Welcome to the %1 installer.</h1> + + + + + %1 support + + + + + About %1 setup + + + + + About %1 installer + + + + + <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. + + + + + WelcomeQmlViewStep + + + Welcome + + + + + WelcomeViewStep + + + Welcome + + + + + about + + + <h1>%1</h1><br/> + <strong>%2<br/> + for %3</strong><br/><br/> + Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/> + Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/> + Thanks to <a href='https://calamares.io/team/'>the Calamares team</a> + and the <a href='https://www.transifex.com/calamares/calamares/'>Calamares + translators team</a>.<br/><br/> + <a href='https://calamares.io/'>Calamares</a> + development is sponsored by <br/> + <a href='http://www.blue-systems.com/'>Blue Systems</a> - + Liberating Software. + + + + + Back + + + + + keyboardq + + + Keyboard Model + + + + + Pick your preferred keyboard model or use the default one based on the detected hardware + + + + + Refresh + + + + + + Layouts + + + + + + Keyboard Layout + + + + + Models + + + + + Variants + + + + + Test your keyboard + + + + + notesqml + + + <h3>%1</h3> + <p>These are example release notes.</p> + + + + + release_notes + + + <h3>%1</h3> + <p>This an example QML file, showing options in RichText with Flickable content.</p> + + <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> + + <p><b>This is bold text</b></p> + <p><i>This is italic text</i></p> + <p><u>This is underlined text</u></p> + <p><center>This text will be center-aligned.</center></p> + <p><s>This is strikethrough</s></p> + + <p>Code example: + <code>ls -l /home</code></p> + + <p><b>Lists:</b></p> + <ul> + <li>Intel CPU systems</li> + <li>AMD CPU systems</li> + </ul> + + <p>The vertical scrollbar is adjustable, current width set to 10.</p> + + + + + Back + + + + + welcomeq + + + <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> + + + + + About + + + + + Support + + + + + Known issues + + + + + Release notes + + + + + Donate + + + + diff --git a/lang/calamares_az_AZ.ts b/lang/calamares_az_AZ.ts new file mode 100644 index 000000000..65191f080 --- /dev/null +++ b/lang/calamares_az_AZ.ts @@ -0,0 +1,3827 @@ + + + + + BootInfoWidget + + + The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. + + + + + This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. + + + + + This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. + + + + + BootLoaderModel + + + Master Boot Record of %1 + + + + + Boot Partition + + + + + System Partition + + + + + Do not install a boot loader + + + + + %1 (%2) + + + + + Calamares::BlankViewStep + + + Blank Page + + + + + Calamares::DebugWindow + + + Form + + + + + GlobalStorage + + + + + JobQueue + + + + + Modules + + + + + Type: + + + + + + none + + + + + Interface: + + + + + Tools + + + + + Reload Stylesheet + + + + + Widget Tree + + + + + Debug information + + + + + Calamares::ExecutionViewStep + + + Set up + + + + + Install + + + + + Calamares::FailJob + + + Job failed (%1) + + + + + Programmed job failure was explicitly requested. + + + + + Calamares::JobThread + + + Done + + + + + Calamares::NamedJob + + + Example job (%1) + + + + + Calamares::ProcessJob + + + Run command '%1' in target system. + + + + + Run command '%1'. + + + + + Running command %1 %2 + + + + + Calamares::PythonJob + + + Running %1 operation. + + + + + Bad working directory path + + + + + Working directory %1 for python job %2 is not readable. + + + + + Bad main script file + + + + + Main script file %1 for python job %2 is not readable. + + + + + Boost.Python error in job "%1". + + + + + Calamares::QmlViewStep + + + Loading ... + + + + + QML Step <i>%1</i>. + + + + + Loading failed. + + + + + Calamares::RequirementsChecker + + + Waiting for %n module(s). + + + + + + + + (%n second(s)) + + + + + + + + System-requirements checking is complete. + + + + + Calamares::ViewManager + + + Setup Failed + + + + + Installation Failed + + + + + Would you like to paste the install log to the web? + + + + + Error + + + + + + &Yes + + + + + + &No + + + + + &Close + + + + + Install Log Paste URL + + + + + The upload was unsuccessful. No web-paste was done. + + + + + Calamares Initialization Failed + + + + + %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. + + + + + <br/>The following modules could not be loaded: + + + + + Continue with setup? + + + + + Continue with installation? + + + + + The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> + + + + + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> + + + + + &Set up now + + + + + &Install now + + + + + Go &back + + + + + &Set up + + + + + &Install + + + + + Setup is complete. Close the setup program. + + + + + The installation is complete. Close the installer. + + + + + Cancel setup without changing the system. + + + + + Cancel installation without changing the system. + + + + + &Next + + + + + &Back + + + + + &Done + + + + + &Cancel + + + + + Cancel setup? + + + + + Cancel installation? + + + + + Do you really want to cancel the current setup process? +The setup program will quit and all changes will be lost. + + + + + Do you really want to cancel the current install process? +The installer will quit and all changes will be lost. + + + + + CalamaresPython::Helper + + + Unknown exception type + + + + + unparseable Python error + + + + + unparseable Python traceback + + + + + Unfetchable Python error. + + + + + CalamaresUtils + + + Install log posted to: +%1 + + + + + CalamaresWindow + + + Show debug information + + + + + &Back + + + + + &Next + + + + + &Cancel + + + + + %1 Setup Program + + + + + %1 Installer + + + + + CheckerContainer + + + Gathering system information... + + + + + ChoicePage + + + Form + + + + + Select storage de&vice: + + + + + + + + Current: + + + + + After: + + + + + <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Having a GPT partition table and <strong>fat32 512Mb /boot partition is a must for UEFI installs</strong>, either use an existing without formatting or create one. + + + + + Reuse %1 as home partition for %2. + + + + + <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> + + + + + %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. + + + + + Boot loader location: + + + + + <strong>Select a partition to install on</strong> + + + + + An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. + + + + + The EFI system partition at %1 will be used for starting %2. + + + + + EFI system partition: + + + + + This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + + + + <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. + + + + + + + + <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. + + + + + + + + <strong>Replace a partition</strong><br/>Replaces a partition with %1. + + + + + This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. + + + + + No Swap + + + + + Reuse Swap + + + + + Swap (no Hibernate) + + + + + Swap (with Hibernate) + + + + + Swap to file + + + + + ClearMountsJob + + + Clear mounts for partitioning operations on %1 + + + + + Clearing mounts for partitioning operations on %1. + + + + + Cleared all mounts for %1 + + + + + ClearTempMountsJob + + + Clear all temporary mounts. + + + + + Clearing all temporary mounts. + + + + + Cannot get list of temporary mounts. + + + + + Cleared all temporary mounts. + + + + + CommandList + + + + Could not run command. + + + + + The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. + + + + + The command needs to know the user's name, but no username is defined. + + + + + Config + + + Set keyboard model to %1.<br/> + + + + + Set keyboard layout to %1/%2. + + + + + The system language will be set to %1. + + + + + The numbers and dates locale will be set to %1. + + + + + Set timezone to %1/%2.<br/> + + + + + Network Installation. (Disabled: Incorrect configuration) + + + + + Network Installation. (Disabled: Received invalid groups data) + + + + + Network Installation. (Disabled: internal error) + + + + + Network Installation. (Disabled: Unable to fetch package lists, check your network connection) + + + + + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. + + + + + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. + + + + + This program will ask you some questions and set up %2 on your computer. + + + + + <h1>Welcome to the Calamares setup program for %1.</h1> + + + + + <h1>Welcome to %1 setup.</h1> + + + + + <h1>Welcome to the Calamares installer for %1.</h1> + + + + + <h1>Welcome to the %1 installer.</h1> + + + + + ContextualProcessJob + + + Contextual Processes Job + + + + + CreatePartitionDialog + + + Create a Partition + + + + + Si&ze: + + + + + MiB + + + + + Partition &Type: + + + + + &Primary + + + + + E&xtended + + + + + Fi&le System: + + + + + LVM LV name + + + + + &Mount Point: + + + + + Flags: + + + + + En&crypt + + + + + Logical + + + + + Primary + + + + + GPT + + + + + Mountpoint already in use. Please select another one. + + + + + CreatePartitionJob + + + Create new %2MiB partition on %4 (%3) with file system %1. + + + + + Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. + + + + + Creating new %1 partition on %2. + + + + + The installer failed to create partition on disk '%1'. + + + + + CreatePartitionTableDialog + + + Create Partition Table + + + + + Creating a new partition table will delete all existing data on the disk. + + + + + What kind of partition table do you want to create? + + + + + Master Boot Record (MBR) + + + + + GUID Partition Table (GPT) + + + + + CreatePartitionTableJob + + + Create new %1 partition table on %2. + + + + + Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). + + + + + Creating new %1 partition table on %2. + + + + + The installer failed to create a partition table on %1. + + + + + CreateUserJob + + + Create user %1 + + + + + Create user <strong>%1</strong>. + + + + + Creating user %1. + + + + + Sudoers dir is not writable. + + + + + Cannot create sudoers file for writing. + + + + + Cannot chmod sudoers file. + + + + + Cannot open groups file for reading. + + + + + CreateVolumeGroupDialog + + + Create Volume Group + + + + + CreateVolumeGroupJob + + + Create new volume group named %1. + + + + + Create new volume group named <strong>%1</strong>. + + + + + Creating new volume group named %1. + + + + + The installer failed to create a volume group named '%1'. + + + + + DeactivateVolumeGroupJob + + + + Deactivate volume group named %1. + + + + + Deactivate volume group named <strong>%1</strong>. + + + + + The installer failed to deactivate a volume group named %1. + + + + + DeletePartitionJob + + + Delete partition %1. + + + + + Delete partition <strong>%1</strong>. + + + + + Deleting partition %1. + + + + + The installer failed to delete partition %1. + + + + + DeviceInfoWidget + + + This device has a <strong>%1</strong> partition table. + + + + + This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. + + + + + This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. + + + + + <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. + + + + + <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. + + + + + The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. + + + + + DeviceModel + + + %1 - %2 (%3) + device[name] - size[number] (device-node[name]) + + + + + %1 - (%2) + device[name] - (device-node[name]) + + + + + DracutLuksCfgJob + + + Write LUKS configuration for Dracut to %1 + + + + + Skip writing LUKS configuration for Dracut: "/" partition is not encrypted + + + + + Failed to open %1 + + + + + DummyCppJob + + + Dummy C++ Job + + + + + EditExistingPartitionDialog + + + Edit Existing Partition + + + + + Content: + + + + + &Keep + + + + + Format + + + + + Warning: Formatting the partition will erase all existing data. + + + + + &Mount Point: + + + + + Si&ze: + + + + + MiB + + + + + Fi&le System: + + + + + Flags: + + + + + Mountpoint already in use. Please select another one. + + + + + EncryptWidget + + + Form + + + + + En&crypt system + + + + + Passphrase + + + + + Confirm passphrase + + + + + Please enter the same passphrase in both boxes. + + + + + FillGlobalStorageJob + + + Set partition information + + + + + Install %1 on <strong>new</strong> %2 system partition. + + + + + Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. + + + + + Install %2 on %3 system partition <strong>%1</strong>. + + + + + Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. + + + + + Install boot loader on <strong>%1</strong>. + + + + + Setting up mount points. + + + + + FinishedPage + + + Form + + + + + &Restart now + + + + + <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. + + + + + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> + + + + + <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. + + + + + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> + + + + + <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. + + + + + <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. + + + + + FinishedViewStep + + + Finish + + + + + Setup Complete + + + + + Installation Complete + + + + + The setup of %1 is complete. + + + + + The installation of %1 is complete. + + + + + FormatPartitionJob + + + Format partition %1 (file system: %2, size: %3 MiB) on %4. + + + + + Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. + + + + + Formatting partition %1 with file system %2. + + + + + The installer failed to format partition %1 on disk '%2'. + + + + + GeneralRequirements + + + has at least %1 GiB available drive space + + + + + There is not enough drive space. At least %1 GiB is required. + + + + + has at least %1 GiB working memory + + + + + The system does not have enough working memory. At least %1 GiB is required. + + + + + is plugged in to a power source + + + + + The system is not plugged in to a power source. + + + + + is connected to the Internet + + + + + The system is not connected to the Internet. + + + + + is running the installer as an administrator (root) + + + + + The setup program is not running with administrator rights. + + + + + The installer is not running with administrator rights. + + + + + has a screen large enough to show the whole installer + + + + + The screen is too small to display the setup program. + + + + + The screen is too small to display the installer. + + + + + HostInfoJob + + + Collecting information about your machine. + + + + + IDJob + + + + + + OEM Batch Identifier + + + + + Could not create directories <code>%1</code>. + + + + + Could not open file <code>%1</code>. + + + + + Could not write to file <code>%1</code>. + + + + + InitcpioJob + + + Creating initramfs with mkinitcpio. + + + + + InitramfsJob + + + Creating initramfs. + + + + + InteractiveTerminalPage + + + Konsole not installed + + + + + Please install KDE Konsole and try again! + + + + + Executing script: &nbsp;<code>%1</code> + + + + + InteractiveTerminalViewStep + + + Script + + + + + KeyboardPage + + + Set keyboard model to %1.<br/> + + + + + Set keyboard layout to %1/%2. + + + + + KeyboardQmlViewStep + + + Keyboard + + + + + KeyboardViewStep + + + Keyboard + + + + + LCLocaleDialog + + + System locale setting + + + + + The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. + + + + + &Cancel + + + + + &OK + + + + + LicensePage + + + Form + + + + + <h1>License Agreement</h1> + + + + + I accept the terms and conditions above. + + + + + Please review the End User License Agreements (EULAs). + + + + + This setup procedure will install proprietary software that is subject to licensing terms. + + + + + If you do not agree with the terms, the setup procedure cannot continue. + + + + + This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. + + + + + If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. + + + + + LicenseViewStep + + + License + + + + + LicenseWidget + + + URL: %1 + + + + + <strong>%1 driver</strong><br/>by %2 + %1 is an untranslatable product name, example: Creative Audigy driver + + + + + <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> + %1 is usually a vendor name, example: Nvidia graphics driver + + + + + <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1 codec</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1 package</strong><br/><font color="Grey">by %2</font> + + + + + <strong>%1</strong><br/><font color="Grey">by %2</font> + + + + + File: %1 + + + + + Hide license text + + + + + Show the license text + + + + + Open license agreement in browser. + + + + + LocalePage + + + Region: + + + + + Zone: + + + + + + &Change... + + + + + The system language will be set to %1. + + + + + The numbers and dates locale will be set to %1. + + + + + Set timezone to %1/%2.<br/> + + + + + LocaleQmlViewStep + + + Location + + + + + LocaleViewStep + + + Location + + + + + LuksBootKeyFileJob + + + Configuring LUKS key file. + + + + + + No partitions are defined. + + + + + + + Encrypted rootfs setup error + + + + + Root partition %1 is LUKS but no passphrase has been set. + + + + + Could not create LUKS key file for root partition %1. + + + + + Could not configure LUKS key file on partition %1. + + + + + MachineIdJob + + + Generate machine-id. + + + + + Configuration Error + + + + + No root mount point is set for MachineId. + + + + + NetInstallViewStep + + + + Package selection + + + + + Office software + + + + + Office package + + + + + Browser software + + + + + Browser package + + + + + Web browser + + + + + Kernel + + + + + Services + + + + + Login + + + + + Desktop + + + + + Applications + + + + + Communication + + + + + Development + + + + + Office + + + + + Multimedia + + + + + Internet + + + + + Theming + + + + + Gaming + + + + + Utilities + + + + + NotesQmlViewStep + + + Notes + + + + + OEMPage + + + Ba&tch: + + + + + <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> + + + + + <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> + + + + + OEMViewStep + + + OEM Configuration + + + + + Set the OEM Batch Identifier to <code>%1</code>. + + + + + PWQ + + + Password is too short + + + + + Password is too long + + + + + Password is too weak + + + + + Memory allocation error when setting '%1' + + + + + Memory allocation error + + + + + The password is the same as the old one + + + + + The password is a palindrome + + + + + The password differs with case changes only + + + + + The password is too similar to the old one + + + + + The password contains the user name in some form + + + + + The password contains words from the real name of the user in some form + + + + + The password contains forbidden words in some form + + + + + The password contains less than %1 digits + + + + + The password contains too few digits + + + + + The password contains less than %1 uppercase letters + + + + + The password contains too few uppercase letters + + + + + The password contains less than %1 lowercase letters + + + + + The password contains too few lowercase letters + + + + + The password contains less than %1 non-alphanumeric characters + + + + + The password contains too few non-alphanumeric characters + + + + + The password is shorter than %1 characters + + + + + The password is too short + + + + + The password is just rotated old one + + + + + The password contains less than %1 character classes + + + + + The password does not contain enough character classes + + + + + The password contains more than %1 same characters consecutively + + + + + The password contains too many same characters consecutively + + + + + The password contains more than %1 characters of the same class consecutively + + + + + The password contains too many characters of the same class consecutively + + + + + The password contains monotonic sequence longer than %1 characters + + + + + The password contains too long of a monotonic character sequence + + + + + No password supplied + + + + + Cannot obtain random numbers from the RNG device + + + + + Password generation failed - required entropy too low for settings + + + + + The password fails the dictionary check - %1 + + + + + The password fails the dictionary check + + + + + Unknown setting - %1 + + + + + Unknown setting + + + + + Bad integer value of setting - %1 + + + + + Bad integer value + + + + + Setting %1 is not of integer type + + + + + Setting is not of integer type + + + + + Setting %1 is not of string type + + + + + Setting is not of string type + + + + + Opening the configuration file failed + + + + + The configuration file is malformed + + + + + Fatal failure + + + + + Unknown error + + + + + Password is empty + + + + + PackageChooserPage + + + Form + + + + + Product Name + + + + + TextLabel + + + + + Long Product Description + + + + + Package Selection + + + + + Please pick a product from the list. The selected product will be installed. + + + + + PackageChooserViewStep + + + Packages + + + + + PackageModel + + + Name + + + + + Description + + + + + Page_Keyboard + + + Form + + + + + Keyboard Model: + + + + + Type here to test your keyboard + + + + + Page_UserSetup + + + Form + + + + + What is your name? + + + + + Your Full Name + + + + + What name do you want to use to log in? + + + + + login + + + + + What is the name of this computer? + + + + + <small>This name will be used if you make the computer visible to others on a network.</small> + + + + + Computer Name + + + + + Choose a password to keep your account safe. + + + + + + <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> + + + + + + Password + + + + + + Repeat Password + + + + + When this box is checked, password-strength checking is done and you will not be able to use a weak password. + + + + + Require strong passwords. + + + + + Log in automatically without asking for the password. + + + + + Use the same password for the administrator account. + + + + + Choose a password for the administrator account. + + + + + + <small>Enter the same password twice, so that it can be checked for typing errors.</small> + + + + + PartitionLabelsView + + + Root + + + + + Home + + + + + Boot + + + + + EFI system + + + + + Swap + + + + + New partition for %1 + + + + + New partition + + + + + %1 %2 + size[number] filesystem[name] + + + + + PartitionModel + + + + Free Space + + + + + + New partition + + + + + Name + + + + + File System + + + + + Mount Point + + + + + Size + + + + + PartitionPage + + + Form + + + + + Storage de&vice: + + + + + &Revert All Changes + + + + + New Partition &Table + + + + + Cre&ate + + + + + &Edit + + + + + &Delete + + + + + New Volume Group + + + + + Resize Volume Group + + + + + Deactivate Volume Group + + + + + Remove Volume Group + + + + + I&nstall boot loader on: + + + + + Are you sure you want to create a new partition table on %1? + + + + + Can not create new partition + + + + + The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. + + + + + PartitionViewStep + + + Gathering system information... + + + + + Partitions + + + + + Install %1 <strong>alongside</strong> another operating system. + + + + + <strong>Erase</strong> disk and install %1. + + + + + <strong>Replace</strong> a partition with %1. + + + + + <strong>Manual</strong> partitioning. + + + + + Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). + + + + + <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. + + + + + <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. + + + + + <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). + + + + + Disk <strong>%1</strong> (%2) + + + + + Current: + + + + + After: + + + + + No EFI system partition configured + + + + + An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. + + + + + An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. + + + + + EFI system partition flag not set + + + + + Option to use GPT on BIOS + + + + + A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>bios_grub</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. + + + + + Boot partition not encrypted + + + + + A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. + + + + + has at least one disk device available. + + + + + There are no partitions to install on. + + + + + PlasmaLnfJob + + + Plasma Look-and-Feel Job + + + + + + Could not select KDE Plasma Look-and-Feel package + + + + + PlasmaLnfPage + + + Form + + + + + Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. + + + + + Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. + + + + + PlasmaLnfViewStep + + + Look-and-Feel + + + + + PreserveFiles + + + Saving files for later ... + + + + + No files configured to save for later. + + + + + Not all of the configured files could be preserved. + + + + + ProcessResult + + + +There was no output from the command. + + + + + +Output: + + + + + + External command crashed. + + + + + Command <i>%1</i> crashed. + + + + + External command failed to start. + + + + + Command <i>%1</i> failed to start. + + + + + Internal error when starting command. + + + + + Bad parameters for process job call. + + + + + External command failed to finish. + + + + + Command <i>%1</i> failed to finish in %2 seconds. + + + + + External command finished with errors. + + + + + Command <i>%1</i> finished with exit code %2. + + + + + QObject + + + %1 (%2) + + + + + Requirements checking for module <i>%1</i> is complete. + + + + + unknown + + + + + extended + + + + + unformatted + + + + + swap + + + + + Default Keyboard Model + + + + + + Default + + + + + + + + File not found + + + + + Path <pre>%1</pre> must be an absolute path. + + + + + Could not create new random file <pre>%1</pre>. + + + + + No product + + + + + No description provided. + + + + + (no mount point) + + + + + Unpartitioned space or unknown partition table + + + + + RemoveUserJob + + + Remove live user from target system + + + + + RemoveVolumeGroupJob + + + + Remove Volume Group named %1. + + + + + Remove Volume Group named <strong>%1</strong>. + + + + + The installer failed to remove a volume group named '%1'. + + + + + ReplaceWidget + + + Form + + + + + Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. + + + + + The selected item does not appear to be a valid partition. + + + + + %1 cannot be installed on empty space. Please select an existing partition. + + + + + %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. + + + + + %1 cannot be installed on this partition. + + + + + Data partition (%1) + + + + + Unknown system partition (%1) + + + + + %1 system partition (%2) + + + + + <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. + + + + + <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. + + + + + + + <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. + + + + + The EFI system partition at %1 will be used for starting %2. + + + + + EFI system partition: + + + + + ResizeFSJob + + + Resize Filesystem Job + + + + + Invalid configuration + + + + + The file-system resize job has an invalid configuration and will not run. + + + + + KPMCore not Available + + + + + Calamares cannot start KPMCore for the file-system resize job. + + + + + + + + + Resize Failed + + + + + The filesystem %1 could not be found in this system, and cannot be resized. + + + + + The device %1 could not be found in this system, and cannot be resized. + + + + + + The filesystem %1 cannot be resized. + + + + + + The device %1 cannot be resized. + + + + + The filesystem %1 must be resized, but cannot. + + + + + The device %1 must be resized, but cannot + + + + + ResizePartitionJob + + + Resize partition %1. + + + + + Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong>. + + + + + Resizing %2MiB partition %1 to %3MiB. + + + + + The installer failed to resize partition %1 on disk '%2'. + + + + + ResizeVolumeGroupDialog + + + Resize Volume Group + + + + + ResizeVolumeGroupJob + + + + Resize volume group named %1 from %2 to %3. + + + + + Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong>. + + + + + The installer failed to resize a volume group named '%1'. + + + + + ResultsListDialog + + + For best results, please ensure that this computer: + + + + + System requirements + + + + + ResultsListWidget + + + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> + + + + + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. + + + + + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. + + + + + This program will ask you some questions and set up %2 on your computer. + + + + + ScanningDialog + + + Scanning storage devices... + + + + + Partitioning + + + + + SetHostNameJob + + + Set hostname %1 + + + + + Set hostname <strong>%1</strong>. + + + + + Setting hostname %1. + + + + + + Internal Error + + + + + + Cannot write hostname to target system + + + + + SetKeyboardLayoutJob + + + Set keyboard model to %1, layout to %2-%3 + + + + + Failed to write keyboard configuration for the virtual console. + + + + + + + Failed to write to %1 + + + + + Failed to write keyboard configuration for X11. + + + + + Failed to write keyboard configuration to existing /etc/default directory. + + + + + SetPartFlagsJob + + + Set flags on partition %1. + + + + + Set flags on %1MiB %2 partition. + + + + + Set flags on new partition. + + + + + Clear flags on partition <strong>%1</strong>. + + + + + Clear flags on %1MiB <strong>%2</strong> partition. + + + + + Clear flags on new partition. + + + + + Flag partition <strong>%1</strong> as <strong>%2</strong>. + + + + + Flag %1MiB <strong>%2</strong> partition as <strong>%3</strong>. + + + + + Flag new partition as <strong>%1</strong>. + + + + + Clearing flags on partition <strong>%1</strong>. + + + + + Clearing flags on %1MiB <strong>%2</strong> partition. + + + + + Clearing flags on new partition. + + + + + Setting flags <strong>%2</strong> on partition <strong>%1</strong>. + + + + + Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition. + + + + + Setting flags <strong>%1</strong> on new partition. + + + + + The installer failed to set flags on partition %1. + + + + + SetPasswordJob + + + Set password for user %1 + + + + + Setting password for user %1. + + + + + Bad destination system path. + + + + + rootMountPoint is %1 + + + + + Cannot disable root account. + + + + + passwd terminated with error code %1. + + + + + Cannot set password for user %1. + + + + + usermod terminated with error code %1. + + + + + SetTimezoneJob + + + Set timezone to %1/%2 + + + + + Cannot access selected timezone path. + + + + + Bad path: %1 + + + + + Cannot set timezone. + + + + + Link creation failed, target: %1; link name: %2 + + + + + Cannot set timezone, + + + + + Cannot open /etc/timezone for writing + + + + + ShellProcessJob + + + Shell Processes Job + + + + + SlideCounter + + + %L1 / %L2 + slide counter, %1 of %2 (numeric) + + + + + SummaryPage + + + This is an overview of what will happen once you start the setup procedure. + + + + + This is an overview of what will happen once you start the install procedure. + + + + + SummaryViewStep + + + Summary + + + + + TrackingInstallJob + + + Installation feedback + + + + + Sending installation feedback. + + + + + Internal error in install-tracking. + + + + + HTTP request timed out. + + + + + TrackingMachineNeonJob + + + Machine feedback + + + + + Configuring machine feedback. + + + + + + Error in machine feedback configuration. + + + + + Could not configure machine feedback correctly, script error %1. + + + + + Could not configure machine feedback correctly, Calamares error %1. + + + + + TrackingPage + + + Form + + + + + Placeholder + + + + + <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> + + + + + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> + + + + + Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. + + + + + By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. + + + + + By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. + + + + + By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. + + + + + TrackingViewStep + + + Feedback + + + + + UsersPage + + + <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> + + + + + <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> + + + + + Your username is too long. + + + + + Your username must start with a lowercase letter or underscore. + + + + + Only lowercase letters, numbers, underscore and hyphen are allowed. + + + + + Your hostname is too short. + + + + + Your hostname is too long. + + + + + Only letters, numbers, underscore and hyphen are allowed. + + + + + Your passwords do not match! + + + + + UsersViewStep + + + Users + + + + + VariantModel + + + Key + + + + + Value + + + + + VolumeGroupBaseDialog + + + Create Volume Group + + + + + List of Physical Volumes + + + + + Volume Group Name: + + + + + Volume Group Type: + + + + + Physical Extent Size: + + + + + MiB + + + + + Total Size: + + + + + Used Size: + + + + + Total Sectors: + + + + + Quantity of LVs: + + + + + WelcomePage + + + Form + + + + + + Select application and system language + + + + + &About + + + + + Open donations website + + + + + &Donate + + + + + Open help and support website + + + + + &Support + + + + + Open issues and bug-tracking website + + + + + &Known issues + + + + + Open release notes website + + + + + &Release notes + + + + + <h1>Welcome to the Calamares setup program for %1.</h1> + + + + + <h1>Welcome to %1 setup.</h1> + + + + + <h1>Welcome to the Calamares installer for %1.</h1> + + + + + <h1>Welcome to the %1 installer.</h1> + + + + + %1 support + + + + + About %1 setup + + + + + About %1 installer + + + + + <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. + + + + + WelcomeQmlViewStep + + + Welcome + + + + + WelcomeViewStep + + + Welcome + + + + + about + + + <h1>%1</h1><br/> + <strong>%2<br/> + for %3</strong><br/><br/> + Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/> + Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/> + Thanks to <a href='https://calamares.io/team/'>the Calamares team</a> + and the <a href='https://www.transifex.com/calamares/calamares/'>Calamares + translators team</a>.<br/><br/> + <a href='https://calamares.io/'>Calamares</a> + development is sponsored by <br/> + <a href='http://www.blue-systems.com/'>Blue Systems</a> - + Liberating Software. + + + + + Back + + + + + keyboardq + + + Keyboard Model + + + + + Pick your preferred keyboard model or use the default one based on the detected hardware + + + + + Refresh + + + + + + Layouts + + + + + + Keyboard Layout + + + + + Models + + + + + Variants + + + + + Test your keyboard + + + + + notesqml + + + <h3>%1</h3> + <p>These are example release notes.</p> + + + + + release_notes + + + <h3>%1</h3> + <p>This an example QML file, showing options in RichText with Flickable content.</p> + + <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> + + <p><b>This is bold text</b></p> + <p><i>This is italic text</i></p> + <p><u>This is underlined text</u></p> + <p><center>This text will be center-aligned.</center></p> + <p><s>This is strikethrough</s></p> + + <p>Code example: + <code>ls -l /home</code></p> + + <p><b>Lists:</b></p> + <ul> + <li>Intel CPU systems</li> + <li>AMD CPU systems</li> + </ul> + + <p>The vertical scrollbar is adjustable, current width set to 10.</p> + + + + + Back + + + + + welcomeq + + + <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> + + + + + About + + + + + Support + + + + + Known issues + + + + + Release notes + + + + + Donate + + + + diff --git a/lang/calamares_hi.ts b/lang/calamares_hi.ts index 60121a630..2d47397e6 100644 --- a/lang/calamares_hi.ts +++ b/lang/calamares_hi.ts @@ -16,7 +16,7 @@ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. - यह सिस्टम <strong>BIOS</strong>बूट वातावरण के साथ शुरू किया गया।<br><br>BIOS वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> जैसे बूट लोडर को, या तो विभाजन की शुरुआत में या फिर <strong>मास्टर बूट रिकॉर्ड</strong> पर विभाजन तालिका की शुरुआत में इंस्टॉल (सुझाया जाता है) करना होगा। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको इसे खुद ही बनाना होगा। + यह सिस्टम <strong>BIOS</strong>बूट वातावरण के साथ शुरू किया गया।<br><br>BIOS वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> जैसे बूट लोडर को, या तो विभाजन की शुरुआत में या फिर <strong>Master Boot Record</strong> पर विभाजन तालिका की शुरुआत में इंस्टॉल (सुझाया जाता है) करना होगा। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको इसे खुद ही बनाना होगा। @@ -65,7 +65,7 @@ GlobalStorage - ग्लोबल स्टोरेज + GlobalStorage @@ -80,7 +80,7 @@ Type: - प्रकार : + प्रकार @@ -111,7 +111,7 @@ Debug information - डीबग जानकारी + डीबग संबंधी जानकारी @@ -145,7 +145,7 @@ Done - पूर्ण हुआ + पूर्ण @@ -161,7 +161,7 @@ Run command '%1' in target system. - लक्षित सिस्टम में कमांड '%1' चलाएँ। + लक्षित सिस्टम पर कमांड '%1' चलाएँ। @@ -189,17 +189,17 @@ Working directory %1 for python job %2 is not readable. - पाइथन कार्य %2 के लिए कार्यरत डायरेक्टरी %1 रीड करने योग्य नहीं है। + पाइथन कार्य %2 हेतु कार्यरत डायरेक्टरी %1 रीड योग्य नहीं है। Bad main script file - ख़राब मुख्य स्क्रिप्ट फ़ाइल + गलत मुख्य स्क्रिप्ट फ़ाइल Main script file %1 for python job %2 is not readable. - पाइथन कार्य %2 हेतु मुख्य स्क्रिप्ट फ़ाइल %1 रीड करने योग्य नहीं है। + पाइथन कार्य %2 हेतु मुख्य स्क्रिप्ट फ़ाइल %1 रीड योग्य नहीं है। @@ -212,17 +212,17 @@ Loading ... - + लोड हो रहा है ... QML Step <i>%1</i>. - + QML चरण <i>%1</i>। Loading failed. - + लोड करना विफल रहा। @@ -259,12 +259,12 @@ Installation Failed - इंस्टॉल विफल रहा + इंस्टॉल विफल रहा। Would you like to paste the install log to the web? - + क्या आप इंस्टॉल प्रक्रिया की लॉग फ़ाइल इंटरनेट पर पेस्ट करना चाहेंगे ? @@ -291,12 +291,12 @@ Install Log Paste URL - + इंस्टॉल प्रक्रिया की लॉग फ़ाइल पेस्ट करें The upload was unsuccessful. No web-paste was done. - अपलोड असफल रहा। कोई वेब-पेस्ट नही किया गया। + अपलोड विफल रहा। इंटरनेट पर पेस्ट नहीं हो सका। @@ -331,7 +331,7 @@ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - %2 इंस्टॉल करने हेतु %1 इंस्टॉलर आपकी डिस्क में बदलाव करने वाला है।<br/><strong>आप इन बदलावों को पूर्ववत नहीं कर पाएंगे।</strong> + %2 इंस्टॉल करने के लिए %1 इंस्टॉलर आपकी डिस्क में बदलाव करने वाला है।<br/><strong>आप इन बदलावों को पूर्ववत नहीं कर पाएंगे।</strong> @@ -428,7 +428,7 @@ The installer will quit and all changes will be lost. Unknown exception type - अपवाद का प्रकार अज्ञात + अपवाद का प्रकार अज्ञात है @@ -443,7 +443,7 @@ The installer will quit and all changes will be lost. Unfetchable Python error. - पहुँच से बाहर पाइथन त्रुटि। + अप्राप्य पाइथन त्रुटि। @@ -452,7 +452,8 @@ The installer will quit and all changes will be lost. Install log posted to: %1 - + इंस्टॉल प्रक्रिया की लॉग फ़ाइल, यहाँ पेस्ट की गई : +%1 @@ -460,7 +461,7 @@ The installer will quit and all changes will be lost. Show debug information - डीबग जानकारी दिखाएँ + डीबग संबंधी जानकारी दिखाएँ @@ -519,12 +520,12 @@ The installer will quit and all changes will be lost. After: - बाद में : + बाद में: <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. Having a GPT partition table and <strong>fat32 512Mb /boot partition is a must for UEFI installs</strong>, either use an existing without formatting or create one. - + <strong>मैनुअल विभाजन</strong><br/>आप स्वयं भी विभाजन बना व उनका आकार बदल सकते है। UEFI इंस्टॉल के लिए GPT विभाजन तालिका और <strong>fat32 512Mb का /boot विभाजन होना जरूरी है</strong>, या तो पहले से मौजूद को ही बिना फॉर्मेट किए इस्तेमाल करें या फिर नया बनाएँ। @@ -534,7 +535,7 @@ The installer will quit and all changes will be lost. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> - <strong>छोटा करने हेतु विभाजन चुनें, फिर नीचे bar से उसका आकर सेट करें</strong> + <strong>छोटा करने के लिए विभाजन चुनें, फिर नीचे bar से उसका आकर सेट करें</strong> @@ -544,12 +545,12 @@ The installer will quit and all changes will be lost. Boot loader location: - बूट लोडर का स्थान : + बूट लोडर का स्थान: <strong>Select a partition to install on</strong> - <strong>इंस्टॉल हेतु विभाजन चुनें</strong> + <strong>इंस्टॉल के लिए विभाजन चुनें</strong> @@ -651,7 +652,7 @@ The installer will quit and all changes will be lost. Cleared all mounts for %1 - %1 हेतु सभी माउंट हटा दिए गए + %1 के लिए सभी माउंट हटा दिए गए @@ -726,7 +727,7 @@ The installer will quit and all changes will be lost. Network Installation. (Disabled: Incorrect configuration) - + नेटवर्क इंस्टॉल। (निष्क्रिय : गलत विन्यास) @@ -736,7 +737,7 @@ The installer will quit and all changes will be lost. Network Installation. (Disabled: internal error) - + नेटवर्क इंस्टॉल। (निष्क्रिय : आंतरिक त्रुटि) @@ -746,27 +747,27 @@ The installer will quit and all changes will be lost. This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - यह कंप्यूटर %1 को सेटअप करने की न्यूनतम आवश्यकताओं को पूरा नहीं करता।<br/>सेटअप जारी नहीं रखा जा सकता।<a href="#details">विवरण...</a> + यह कंप्यूटर %1 सेटअप करने की न्यूनतम आवश्यकताओं को पूरा नहीं करता।<br/>सेटअप जारी नहीं रखा जा सकता।<a href="#details">विवरण...</a> This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - यह कंप्यूटर %1 को इंस्टॉल करने की न्यूनतम आवश्यकताओं को पूरा नहीं करता।<br/>इंस्टॉल जारी नहीं रखा जा सकता।<a href="#details">विवरण...</a> + यह कंप्यूटर %1 इंस्टॉल करने की न्यूनतम आवश्यकताओं को पूरा नहीं करता।<br/>इंस्टॉल जारी नहीं रखा जा सकता।<a href="#details">विवरण...</a> This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - यह कंप्यूटर %1 को सेटअप करने हेतु सुझाई गई आवश्यकताओं को पूरा नहीं करता।<br/>सेटअप जारी रखा जा सकता है, लेकिन कुछ विशेषताएँ को निष्क्रिय किया जा सकता हैं। + यह कंप्यूटर %1 सेटअप करने हेतु सुझाई गई आवश्यकताओं को पूरा नहीं करता।<br/>सेटअप जारी रखा जा सकता है, लेकिन कुछ विशेषताएँ निष्क्रिय कर दी जाएँगी। This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - यह कंप्यूटर %1 को इंस्टॉल करने हेतु सुझाई गई आवश्यकताओं को पूरा नहीं करता।<br/>इंस्टॉल जारी रखा जा सकता है, लेकिन कुछ विशेषताएँ को निष्क्रिय किया जा सकता हैं। + यह कंप्यूटर %1 इंस्टॉल करने हेतु सुझाई गई आवश्यकताओं को पूरा नहीं करता।<br/>इंस्टॉल जारी रखा जा सकता है, लेकिन कुछ विशेषताएँ निष्क्रिय कर दी जाएँगी। This program will ask you some questions and set up %2 on your computer. - यह प्रोग्राम एक प्रश्नावली के आधार पर आपके कंप्यूटर पर %2 को सेट करेगा। + यह प्रोग्राम प्रश्नावली के माध्यम से आपके कंप्यूटर पर %2 को सेट करेगा। @@ -781,7 +782,7 @@ The installer will quit and all changes will be lost. <h1>Welcome to the Calamares installer for %1.</h1> - <h1>%1 के लिए Calamares इंस्टॉलर में आपका स्वागत है।</h1> + <h1>%1 हेतु Calamares इंस्टॉलर में आपका स्वागत है।</h1> @@ -992,7 +993,7 @@ The installer will quit and all changes will be lost. Create Volume Group - वॉल्यूम समूह बनाएँ + वॉल्यूम समूह बनाएं @@ -1397,7 +1398,7 @@ The installer will quit and all changes will be lost. is running the installer as an administrator (root) - + इंस्टॉलर को प्रबंधक(रुट) के अंतर्गत चला रहा है @@ -1412,7 +1413,7 @@ The installer will quit and all changes will be lost. has a screen large enough to show the whole installer - + स्क्रीन का माप इंस्टॉलर को पूर्णतया प्रदर्शित करने में सक्षम हो @@ -1563,7 +1564,7 @@ The installer will quit and all changes will be lost. <h1>License Agreement</h1> - + <h1>लाइसेंस अनुबंध</h1> @@ -1573,27 +1574,27 @@ The installer will quit and all changes will be lost. Please review the End User License Agreements (EULAs). - + कृपया लक्षित उपयोक्ता लाइसेंस अनुबंधों (EULAs) की समीक्षा करें। This setup procedure will install proprietary software that is subject to licensing terms. - + यह सेटअप प्रक्रिया लाइसेंस शर्तों के अधीन अमुक्त सॉफ्टवेयर को इंस्टॉल करेगी। If you do not agree with the terms, the setup procedure cannot continue. - + यदि आप शर्तों से असहमत है, तो सेटअप प्रक्रिया जारी नहीं रखी जा सकती। This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. - + यह सेटअप प्रक्रिया अतिरिक्त सुविधाएँ प्रदान करने व उपयोक्ता अनुभव में वृद्धि हेतु लाइसेंस शर्तों के अधीन अमुक्त सॉफ्टवेयर को इंस्टॉल कर सकती है। If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. - + यदि आप शर्तों से असहमत है, तो अमुक्त सॉफ्टवेयर इंस्टाल नहीं किया जाएगा व उनके मुक्त विकल्प उपयोग किए जाएँगे। @@ -1609,7 +1610,7 @@ The installer will quit and all changes will be lost. URL: %1 - + यूआरएल : %1 @@ -1646,7 +1647,7 @@ The installer will quit and all changes will be lost. File: %1 - + फ़ाइल : %1 @@ -1656,12 +1657,12 @@ The installer will quit and all changes will be lost. Show the license text - + लाइसेंस लेख दिखाएँ Open license agreement in browser. - + लाइसेंस अनुबंध को ब्राउज़र में खोलें। @@ -1719,35 +1720,35 @@ The installer will quit and all changes will be lost. Configuring LUKS key file. - LUKS कुंजी फाइल विन्यस्त करना। + LUKS कुंजी फ़ाइल विन्यस्त करना। No partitions are defined. - कोई विभाजन परिभाषित नहीं हैं। + कोई विभाजन परिभाषित नहीं है। Encrypted rootfs setup error - एन्क्रिप्टेड rootfs सेटअप में त्रुटि + एन्क्रिप्टेड रुट फ़ाइल सिस्टम सेटअप करने में त्रुटि Root partition %1 is LUKS but no passphrase has been set. - रूट विभाजन %1 LUKS है, लेकिन कोई कूटशब्द सेट नहीं किया गया है। + रुट विभाजन %1, LUKS है परंतु कोई कूटशब्द सेट नहीं है। Could not create LUKS key file for root partition %1. - रूट विभाजन %1 हेतु LUKS कुंजी फाइल बनाने में विफल। + रुट विभाजन %1 हेतु LUKS कुंजी फ़ाइल बनाई नहीं जा सकी। Could not configure LUKS key file on partition %1. - + विभाजन %1 हेतु LUKS कुंजी फ़ाइल विन्यस्त नहीं हो सकी। @@ -1755,7 +1756,7 @@ The installer will quit and all changes will be lost. Generate machine-id. - मशीन-आईडी उत्पन्न करना। + मशीन-आईडी उत्पन्न करें। @@ -1765,7 +1766,7 @@ The installer will quit and all changes will be lost. No root mount point is set for MachineId. - + मशीन-आईडी हेतु कोई रुट माउंट पॉइंट सेट नहीं है। @@ -1779,92 +1780,92 @@ The installer will quit and all changes will be lost. Office software - + ऑफिस सॉफ्टवेयर Office package - + ऑफिस पैकेज Browser software - + ब्राउज़र सॉफ्टवेयर Browser package - + ब्राउज़र पैकेज Web browser - + वेब ब्राउज़र Kernel - + कर्नेल Services - + सेवाएँ Login - + लॉगिन Desktop - + डेस्कटॉप Applications - + अनुप्रयोग Communication - + संचार Development - + सॉफ्टवेयर विकास Office - + ऑफिस Multimedia - + मल्टीमीडिया Internet - + इंटरनेट Theming - + थीम Gaming - + खेल Utilities - + साधन @@ -1872,7 +1873,7 @@ The installer will quit and all changes will be lost. Notes - + नोट्स @@ -1911,17 +1912,17 @@ The installer will quit and all changes will be lost. Password is too short - कूटशब्द काफ़ी छोटा है + कूटशब्द बहुत छोटा है Password is too long - कूटशब्द काफ़ी लंबा है + कूटशब्द बहुत लंबा है Password is too weak - कूटशब्द काफ़ी कमज़ोर है + कूटशब्द बहुत कमज़ोर है @@ -2016,7 +2017,7 @@ The installer will quit and all changes will be lost. The password is too short - कूटशब्द काफ़ी छोटा है + कूटशब्द बहुत छोटा है @@ -2076,7 +2077,7 @@ The installer will quit and all changes will be lost. Password generation failed - required entropy too low for settings - कूटशब्द बनाना विफल रहा - सेटिंग्स के लिए आवश्यक एन्ट्रापी काफ़ी कम है + कूटशब्द बनाना विफल रहा - सेटिंग्स के लिए आवश्यक entropy बहुत कम है @@ -2151,7 +2152,7 @@ The installer will quit and all changes will be lost. Password is empty - पासवर्ड खाली है + कूटशब्द रिक्त है @@ -2164,7 +2165,7 @@ The installer will quit and all changes will be lost. Product Name - उत्पाद का नाम​ + वस्तु का नाम @@ -2174,7 +2175,7 @@ The installer will quit and all changes will be lost. Long Product Description - लंबा उत्पाद विवरण + वस्तु का विस्तृत विवरण @@ -2184,7 +2185,7 @@ The installer will quit and all changes will be lost. Please pick a product from the list. The selected product will be installed. - कृप्या सूची से उत्पाद का चुनाव करें। चयनित उत्पाद इंस्टॉल किया जायेगा। + सूची में से वस्तु विशेष का चयन करें। चयनित वस्तु इंस्टॉल कर दी जाएगी। @@ -2241,7 +2242,7 @@ The installer will quit and all changes will be lost. Your Full Name - आपका पूरा नाम​ + आपके पूरा नाम @@ -2266,18 +2267,18 @@ The installer will quit and all changes will be lost. Computer Name - कंप्यूटर का नाम​ + कंप्यूटर का नाम Choose a password to keep your account safe. - अपना अकाउंट सुरक्षित रखने हेतु कूटशब्द चुनें। + अपना अकाउंट सुरक्षित रखने के लिए पासवर्ड चुनें । <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> - <small>एक ही कूटशब्द दो बार दर्ज़ करें, ताकि उसे टाइप त्रुटि के लिए जांचा जा सके। एक उचित कूटशब्द में अक्षर, अंक व विराम चिन्हों का मेल होता है, उसमें कम-से-कम आठ अक्षर होने चाहिए, और उसे नियमित अंतराल पर बदलते रहना चाहिए।</small> + <small>एक ही कूटशब्द दो बार दर्ज़ करें, ताकि उसे टाइप त्रुटि के लिए जांचा जा सके । एक अच्छे कूटशब्द में अक्षर, अंक व विराम चिन्हों का मेल होता है, उसमें कम-से-कम आठ अक्षर होने चाहिए, और उसे नियमित अंतराल पर बदलते रहना चाहिए।</small> @@ -2289,22 +2290,22 @@ The installer will quit and all changes will be lost. Repeat Password - कूटशब्द दोबारा दर्ज करें + कूटशब्द पुनः दर्ज करें When this box is checked, password-strength checking is done and you will not be able to use a weak password. - डब्बे को चिह्नित करने पर पासवर्ड की मज़बूती की जांच होगी ओर आप कमज़ोर पासवर्ड उपयोग नही कर पाएँगे। + यह बॉक्स टिक करने के परिणाम स्वरुप कूटशब्द-क्षमता की जाँच होगी व आप कमज़ोर कूटशब्द उपयोग नहीं कर पाएंगे। Require strong passwords. - मज़बूत पासवर्डस की आवश्यकता। + मज़बूत कूटशब्द आवश्यक हैं। Log in automatically without asking for the password. - कूटशब्द पूछे बिना स्वतः लॉग इन करें। + कूटशब्द बिना पूछे ही स्वतः लॉग इन करें। @@ -2314,7 +2315,7 @@ The installer will quit and all changes will be lost. Choose a password for the administrator account. - प्रबंधक अकाउंट हेतु कूटशब्द चुनें। + प्रबंधक अकाउंट के लिए कूटशब्द चुनें। @@ -2373,7 +2374,7 @@ The installer will quit and all changes will be lost. Free Space - रिक्त स्पेस + खाली स्पेस @@ -2412,7 +2413,7 @@ The installer will quit and all changes will be lost. Storage de&vice: - स्टोरेज डिवाइस (&v): + डिवाइस (&v): @@ -2545,7 +2546,7 @@ The installer will quit and all changes will be lost. After: - बाद में : + बाद में: @@ -2555,12 +2556,12 @@ The installer will quit and all changes will be lost. An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. - + %1 आरंभ करने हेतु EFI सिस्टम विभाजन ज़रूरी है।<br/><br/>EFI सिस्टम विभाजन को विन्यस्त करने के लिए, वापस जाएँ और चुनें या बनाएँ एक FAT32 फ़ाइल सिस्टम जिस पर <strong>%3</strong> flag चालू हो व माउंट पॉइंट <strong>%2</strong>हो।<br/><br/>आप बिना सेट करें भी आगे बढ़ सकते है पर सिस्टम चालू नहीं होगा। An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - + %1 को शुरू करने हेतु EFI सिस्टम विभाजन ज़रूरी है।<br/><br/>विभाजन को माउंट पॉइंट <strong>%2</strong> के साथ विन्यस्त किया गया परंतु उसका <strong>%3</strong> फ्लैग सेट नहीं था।<br/> फ्लैग सेट करने के लिए, वापस जाएँ और विभाजन को edit करें।<br/><br/>आप बिना सेट करें भी आगे बढ़ सकते है पर सिस्टम चालू नहीं होगा। @@ -2570,12 +2571,12 @@ The installer will quit and all changes will be lost. Option to use GPT on BIOS - + BIOS पर GPT उपयोग करने के लिए विकल्प A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>bios_grub</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. - + GPT विभाजन तालिका सभी सिस्टम हेतु सबसे उत्तम विकल्प है। यह इंस्टॉलर BIOS सिस्टम के सेटअप को भी समर्थन करता है। <br/><br/>BIOS पर GPT विभाजन तालिका को विन्यस्त करने हेतु, (अगर अब तक नहीं करा है तो) वापस जाकर विभाजन तालिका GPT पर सेट करें, फिर एक 8 MB का बिना फॉर्मेट हुआ विभाजन बनाए जिस पर <strong>bios_grub</strong> का flag हो।<br/><br/>यह बिना फॉर्मेट हुआ 8 MB का विभाजन %1 को BIOS सिस्टम पर GPT के साथ शुरू करने के लिए आवश्यक है। @@ -2595,7 +2596,7 @@ The installer will quit and all changes will be lost. There are no partitions to install on. - + इंस्टॉल हेतु कोई विभाजन नहीं हैं। @@ -2671,7 +2672,7 @@ There was no output from the command. Output: -आउटपुट : +आउटपुट: @@ -2774,27 +2775,27 @@ Output: File not found - फाइल नहीं मिली + फ़ाइल नहीं मिली Path <pre>%1</pre> must be an absolute path. - + फ़ाइल पथ <pre>%1</pre> निरपेक्ष होना चाहिए। Could not create new random file <pre>%1</pre>. - + नवीन यादृच्छिक फ़ाइल <pre>%1</pre>नहीं बनाई जा सकी। No product - कोई उत्पाद नहीं + कोई वस्तु नहीं No description provided. - कोई विवरण मौजूद नहीं + कोई विवरण प्रदान नहीं किया गया। @@ -2844,7 +2845,7 @@ Output: Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. - चुनें कि %1 को कहाँ इंस्टॉल करना है।<br/><font color="red">चेतावनी : </font> यह चयनित विभाजन पर मौजूद सभी फ़ाइलों को हटा देगा। + चुनें कि %1 को कहाँ इंस्टॉल करना है।<br/><font color="red">चेतावनी: </font> यह चयनित विभाजन पर मौजूद सभी फ़ाइलों को हटा देगा। @@ -2854,7 +2855,7 @@ Output: %1 cannot be installed on empty space. Please select an existing partition. - %1 को खाली स्पेस पर इंस्टॉल नहीं किया जा सकता। कृपया कोई मौजूदा विभाजन चुनें। + %1 को खाली स्पेस पर इंस्टॉल नहीं किया जा सकता।कृपया कोई मौजूदा विभाजन चुनें। @@ -2884,7 +2885,7 @@ Output: <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. - <strong>%4</strong><br/><br/>%2 के लिए विभाजन %1 काफ़ी छोटा है। कृपया कम-से-कम %3 GiB की क्षमता वाला कोई विभाजन चुनें। + <strong>%4</strong><br/><br/>%2 के लिए विभाजन %1 बहुत छोटा है।कृपया कम-से-कम %3 GiB की क्षमता वाला कोई विभाजन चुनें । @@ -2906,7 +2907,7 @@ Output: EFI system partition: - EFI सिस्टम विभाजन : + EFI सिस्टम विभाजन: @@ -3260,7 +3261,7 @@ Output: Cannot set password for user %1. - उपयोक्ता %1 हेतु पासवर्ड सेट नहीं किया जा सकता। + उपयोक्ता %1 के लिए पासवर्ड सेट नहीं किया जा सकता। @@ -3298,12 +3299,12 @@ Output: Cannot set timezone, - समय क्षेत्र सेट नहीं हो सका, + समय क्षेत्र सेट नहीं हो सका। Cannot open /etc/timezone for writing - राइट करने हेतु /etc /timezone खोला नहीं जा सका + राइट करने हेतु /etc /timezone खोला नहीं जा सका। @@ -3462,32 +3463,32 @@ Output: Your username is too long. - आपका उपयोक्ता नाम काफ़ी लंबा है। + आपका उपयोक्ता नाम बहुत लंबा है। Your username must start with a lowercase letter or underscore. - + आपके उपयोक्ता नाम का आरंभ lowercase अक्षर या अंडरस्कोर(_) से ही होना चाहिए। Only lowercase letters, numbers, underscore and hyphen are allowed. - + केवल lowercase अक्षर, अंक, अंडरस्कोर(_) व हाइफ़न(-) का उपयोग ही मान्य है। Your hostname is too short. - आपका होस्ट नाम काफ़ी छोटा है। + आपका होस्ट नाम बहुत छोटा है। Your hostname is too long. - आपका होस्ट नाम काफ़ी लंबा है। + आपका होस्ट नाम बहुत लंबा है। Only letters, numbers, underscore and hyphen are allowed. - + केवल अक्षर, अंक, अंडरस्कोर(_) व हाइफ़न(-) का उपयोग ही मान्य है। @@ -3508,12 +3509,12 @@ Output: Key - + कुंजी Value - + मान @@ -3521,7 +3522,7 @@ Output: Create Volume Group - वॉल्यूम समूह बनाएँ + वॉल्यूम समूह बनाएं @@ -3580,7 +3581,7 @@ Output: Select application and system language - ऐप्लिकेशन व सिस्टम भाषा चुनें + अनुप्रयोग व सिस्टम भाषा चुनें @@ -3590,17 +3591,17 @@ Output: Open donations website - दान करने की वेबसाइट खोलें + दान हेतु वेबसाइट खोलें &Donate - &दान करें + दान करें (&D) Open help and support website - मदद व सहायता की वेबसाइट खोलें + सहायता हेतु वेबसाइट खोलें @@ -3620,7 +3621,7 @@ Output: Open release notes website - + प्रकाशन नोट्स हेतु वेबसाइट खोलें @@ -3665,7 +3666,7 @@ Output: <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/><strong>%2<br/>के लिए %3</strong><br/><br/>प्रतिलिप्याधिकार 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>प्रतिलिप्याधिकार 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/><a href="https://calamares.io/team/">Calamares टीम</a> व <a href="https://www.transifex.com/calamares/calamares/">Calamares अनुवादक टीम</a> का धन्यवाद।<br/><br/><a href="https://calamares.io/">Calamares</a> का विकास <br/><a href="http://www.blue-systems.com/">ब्लू सिस्टम्स</a> - लिब्रेटिंग सॉफ्टवेयर द्वारा प्रायोजित है। @@ -3700,12 +3701,23 @@ Output: development is sponsored by <br/> <a href='http://www.blue-systems.com/'>Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/> + <strong>%2<br/> + के लिए %3</strong><br/><br/> + प्रतिलिप्याधिकार 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/> + प्रतिलिप्याधिकार 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/> + <a href='https://calamares.io/team/'>the Calamares टीम</a> + व <a href='https://www.transifex.com/calamares/calamares/'>Calamares + अनुवादक टीम</a>को धन्यवाद।<br/><br/> + <a href='https://calamares.io/'>Calamares</a> + का विकास <br/> + <a href='http://www.blue-systems.com/'>ब्लू सिस्टम्स</a> - + लिब्रेटिंग सॉफ्टवेयर द्वारा प्रायोजित है। Back - + वापस @@ -3713,44 +3725,44 @@ Output: Keyboard Model - + कुंजीपटल मॉडल Pick your preferred keyboard model or use the default one based on the detected hardware - + अपना कुंजीपटल मॉडल चुनें या फिर हार्डवेयर आधारित डिफ़ॉल्ट मॉडल उपयोग करें Refresh - + रिफ्रेश करें Layouts - + अभिन्यास Keyboard Layout - + कुंजीपटल अभिन्यास Models - + मॉडल Variants - + भिन्न रूप Test your keyboard - + अपना कुंजीपटल जाँचें @@ -3759,7 +3771,8 @@ Output: <h3>%1</h3> <p>These are example release notes.</p> - + <h3>%1</h3> + <p>ये उदाहरण रिलीज़ नोट्स हैं।</p> @@ -3787,12 +3800,32 @@ Output: </ul> <p>The vertical scrollbar is adjustable, current width set to 10.</p> - + <h3>%1</h3> + <p>यह एक उदाहरण QML फ़ाइल है, जो फ्लिक योग्य सामग्री युक्त रिच टेक्स्ट के विकल्प प्रदर्शित करती है।</p> + + <p>रिच टेक्स्ट के साथ QML एचटीएमएल टैग उपयोग कर सकता है, फ्लिक योग्य सामग्री टचस्क्रीन में उपयोगी होती है।</p> + + <p><b>यह बोल्ड टेक्स्ट है</b></p> + <p><i>यह तिरछा टेक्स्ट है</i></p> + <p><u>यह रेखांकित टेक्स्ट है</u></p> + <p><center>यह टेक्स्ट केंद्र-संरेखित होगा।</center></p> + <p><s>यह स्ट्राइकथ्रू है</s></p> + + <p>कोड उदाहरण : + <code>ls -l /home</code></p> + + <p><b>सूचियाँ :</b></p> + <ul> + <li>इंटेल सीपीयू सिस्टम</li> + <li>एएमडी सीपीयू सिस्टम</li> + </ul> + + <p>ऊर्ध्वाधर स्क्रॉलबार समायोज्य है, वर्तमान चौड़ाई 10 पर सेट है।</p> Back - + वापस @@ -3801,32 +3834,33 @@ Output: <h3>Welcome to the %1 <quote>%2</quote> installer</h3> <p>This program will ask you some questions and set up %1 on your computer.</p> - + <h3>%1 <quote>%2</quote>इंस्टॉलर में आपका स्वागत है</h3> + <p>यह प्रोग्राम प्रश्नावली के माध्यम से आपके कंप्यूटर पर %1 को सेट करेगा।</p> About - + बारे में Support - + सहायता Known issues - + ज्ञात समस्याएँ Release notes - + रिलीज़ नोट्स Donate - + दान करें From 13d8b85de2b4794dba924ee280185af587aa012c Mon Sep 17 00:00:00 2001 From: Calamares CI Date: Thu, 18 Jun 2020 14:54:45 +0200 Subject: [PATCH 59/63] i18n: [python] Automatic merge of Transifex translations --- lang/python/az/LC_MESSAGES/python.mo | Bin 0 -> 384 bytes lang/python/az/LC_MESSAGES/python.po | 336 ++++++++++++++++++++++++ lang/python/az_AZ/LC_MESSAGES/python.mo | Bin 0 -> 403 bytes lang/python/az_AZ/LC_MESSAGES/python.po | 336 ++++++++++++++++++++++++ lang/python/hi/LC_MESSAGES/python.mo | Bin 10929 -> 11474 bytes lang/python/hi/LC_MESSAGES/python.po | 12 +- 6 files changed, 678 insertions(+), 6 deletions(-) create mode 100644 lang/python/az/LC_MESSAGES/python.mo create mode 100644 lang/python/az/LC_MESSAGES/python.po create mode 100644 lang/python/az_AZ/LC_MESSAGES/python.mo create mode 100644 lang/python/az_AZ/LC_MESSAGES/python.po diff --git a/lang/python/az/LC_MESSAGES/python.mo b/lang/python/az/LC_MESSAGES/python.mo new file mode 100644 index 0000000000000000000000000000000000000000..e7b9aa3c33e09c98ab64184228fe1c71e327e34c GIT binary patch literal 384 zcmYL@!A=4(5QZ^&>d~`@ns|U{X%~$yC3`?z3{hl*EB9e3OUZ7#X^SB5;p_P%?>6x$>NPZalR@&(JTszScJfB}T7B=E!J4X2Mvh6~{?`@X~*d z@hqOck0x(uDk^Op8QWYg$m1rrB-I?FWJ0FmQ`R2x1Ws_=VZj4oAz@t{Fn)V?&AiYn zsC)ytAgO?o6&`<%Du1{i=KnCw7ij1xVGy*$RvmF8WA^Bs|{Lua?4)SY>)4RnBoZ nm+laiW7wml*cd3tP@B?ntg64!Mx7r1Z=, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-04-30 23:13+0200\n" +"PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Language-Team: Azerbaijani (https://www.transifex.com/calamares/teams/20061/az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/modules/packages/main.py:59 src/modules/packages/main.py:68 +#: src/modules/packages/main.py:78 +msgid "Install packages." +msgstr "" + +#: src/modules/packages/main.py:66 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:71 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/packages/main.py:74 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/networkcfg/main.py:37 +msgid "Saving network configuration." +msgstr "" + +#: src/modules/networkcfg/main.py:48 src/modules/initcpiocfg/main.py:205 +#: src/modules/initcpiocfg/main.py:209 src/modules/openrcdmcryptcfg/main.py:78 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/localecfg/main.py:144 +#: src/modules/mount/main.py:145 src/modules/luksopenswaphookcfg/main.py:95 +#: src/modules/luksopenswaphookcfg/main.py:99 src/modules/fstab/main.py:332 +#: src/modules/fstab/main.py:338 src/modules/initramfscfg/main.py:94 +#: src/modules/initramfscfg/main.py:98 src/modules/rawfs/main.py:171 +msgid "Configuration Error" +msgstr "" + +#: src/modules/networkcfg/main.py:49 src/modules/initcpiocfg/main.py:210 +#: src/modules/openrcdmcryptcfg/main.py:83 src/modules/localecfg/main.py:145 +#: src/modules/luksopenswaphookcfg/main.py:100 src/modules/fstab/main.py:339 +#: src/modules/initramfscfg/main.py:99 +msgid "No root mount point is given for
{!s}
to use." +msgstr "" + +#: src/modules/umount/main.py:40 +msgid "Unmount file systems." +msgstr "" + +#: src/modules/initcpiocfg/main.py:37 +msgid "Configuring mkinitcpio." +msgstr "" + +#: src/modules/initcpiocfg/main.py:206 src/modules/openrcdmcryptcfg/main.py:79 +#: src/modules/mount/main.py:146 src/modules/luksopenswaphookcfg/main.py:96 +#: src/modules/fstab/main.py:333 src/modules/initramfscfg/main.py:95 +#: src/modules/rawfs/main.py:172 +msgid "No partitions are defined for
{!s}
to use." +msgstr "" + +#: src/modules/openrcdmcryptcfg/main.py:34 +msgid "Configuring OpenRC dmcrypt service." +msgstr "" + +#: src/modules/unpackfs/main.py:44 +msgid "Filling up filesystems." +msgstr "" + +#: src/modules/unpackfs/main.py:257 +msgid "rsync failed with error code {}." +msgstr "" + +#: src/modules/unpackfs/main.py:302 +msgid "Unpacking image {}/{}, file {}/{}" +msgstr "" + +#: src/modules/unpackfs/main.py:317 +msgid "Starting to unpack {}" +msgstr "" + +#: src/modules/unpackfs/main.py:326 src/modules/unpackfs/main.py:432 +msgid "Failed to unpack image \"{}\"" +msgstr "" + +#: src/modules/unpackfs/main.py:399 +msgid "No mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:400 +msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:405 +msgid "Bad mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:406 +msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:422 src/modules/unpackfs/main.py:426 +#: src/modules/unpackfs/main.py:446 +msgid "Bad unsquash configuration" +msgstr "" + +#: src/modules/unpackfs/main.py:423 +msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" +msgstr "" + +#: src/modules/unpackfs/main.py:427 +msgid "The source filesystem \"{}\" does not exist" +msgstr "" + +#: src/modules/unpackfs/main.py:433 +msgid "" +"Failed to find unsquashfs, make sure you have the squashfs-tools package " +"installed" +msgstr "" + +#: src/modules/unpackfs/main.py:447 +msgid "The destination \"{}\" in the target system is not a directory" +msgstr "" + +#: src/modules/services-systemd/main.py:35 +msgid "Configure systemd services" +msgstr "" + +#: src/modules/services-systemd/main.py:68 +#: src/modules/services-openrc/main.py:102 +msgid "Cannot modify service" +msgstr "" + +#: src/modules/services-systemd/main.py:69 +msgid "" +"systemctl {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:72 +#: src/modules/services-systemd/main.py:76 +msgid "Cannot enable systemd service {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:74 +msgid "Cannot enable systemd target {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:78 +msgid "Cannot disable systemd target {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:80 +msgid "Cannot mask systemd unit {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:82 +msgid "" +"Unknown systemd commands {command!s} and " +"{suffix!s} for unit {name!s}." +msgstr "" + +#: src/modules/dummypython/main.py:44 +msgid "Dummy python job." +msgstr "" + +#: src/modules/dummypython/main.py:46 src/modules/dummypython/main.py:102 +#: src/modules/dummypython/main.py:103 +msgid "Dummy python step {}" +msgstr "" + +#: src/modules/bootloader/main.py:51 +msgid "Install bootloader." +msgstr "" + +#: src/modules/localecfg/main.py:39 +msgid "Configuring locales." +msgstr "" + +#: src/modules/mount/main.py:38 +msgid "Mounting partitions." +msgstr "" + +#: src/modules/plymouthcfg/main.py:36 +msgid "Configure Plymouth theme" +msgstr "" + +#: src/modules/luksopenswaphookcfg/main.py:35 +msgid "Configuring encrypted swap." +msgstr "" + +#: src/modules/fstab/main.py:38 +msgid "Writing fstab." +msgstr "" + +#: src/modules/services-openrc/main.py:38 +msgid "Configure OpenRC services" +msgstr "" + +#: src/modules/services-openrc/main.py:66 +msgid "Cannot add service {name!s} to run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:68 +msgid "Cannot remove service {name!s} from run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:70 +msgid "" +"Unknown service-action {arg!s} for service {name!s} in run-" +"level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:103 +msgid "" +"rc-update {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:110 +msgid "Target runlevel does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:111 +msgid "" +"The path for runlevel {level!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/services-openrc/main.py:119 +msgid "Target service does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:120 +msgid "" +"The path for service {name!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/dracut/main.py:36 +msgid "Creating initramfs with dracut." +msgstr "" + +#: src/modules/dracut/main.py:58 +msgid "Failed to run dracut on the target" +msgstr "" + +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + +#: src/modules/grubcfg/main.py:37 +msgid "Configure GRUB." +msgstr "" + +#: src/modules/displaymanager/main.py:515 +msgid "Cannot write KDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:516 +msgid "KDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:577 +msgid "Cannot write LXDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:578 +msgid "LXDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:661 +msgid "Cannot write LightDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:662 +msgid "LightDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:736 +msgid "Cannot configure LightDM" +msgstr "" + +#: src/modules/displaymanager/main.py:737 +msgid "No LightDM greeter installed." +msgstr "" + +#: src/modules/displaymanager/main.py:768 +msgid "Cannot write SLIM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:769 +msgid "SLIM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:895 +msgid "No display managers selected for the displaymanager module." +msgstr "" + +#: src/modules/displaymanager/main.py:896 +msgid "" +"The displaymanagers list is empty or undefined in bothglobalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:978 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/initramfscfg/main.py:41 +msgid "Configuring initramfs." +msgstr "" + +#: src/modules/hwclock/main.py:35 +msgid "Setting hardware clock." +msgstr "" + +#: src/modules/rawfs/main.py:35 +msgid "Installing data." +msgstr "" diff --git a/lang/python/az_AZ/LC_MESSAGES/python.mo b/lang/python/az_AZ/LC_MESSAGES/python.mo new file mode 100644 index 0000000000000000000000000000000000000000..4c1bf9a19a2913f41a37517d2f12ed173aaf1c9a GIT binary patch literal 403 zcmYL@-%i3X6vi=nwM(zPI3`{|w6sH`qhuEoharkAI7#%zlu<^>XqUDK@*cjP&tiuO ze9158oSc8(@9D`;&FRQ-=D2ViJFXm+0>`^+wq2}d_DZx`@XVtA6pgtyLP-iq)P0H` zV;IMy*Z%Ou8}U+Uiv}haQ*^(|4N4USFBzf{{}R;>dSI4QXc7MokpPi4_=H~HToNbm znaO;`a*k5YmK35b*ApfdObVzUiU!o@)|Q51yk4)HRx@eDjBlEmTH=fqY{@h?*t#1A zw+OlQG24DdAGqNS`h)o3-ft4GtEA=9qV&6Twk+RRToz2o4rFtt4Y%Q2+C#x%uKG6P w8pSeGQz3H-!9>`-bqc#*UQ(, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-04-30 23:13+0200\n" +"PO-Revision-Date: 2017-08-09 10:34+0000\n" +"Language-Team: Azerbaijani (Azerbaijan) (https://www.transifex.com/calamares/teams/20061/az_AZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az_AZ\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/modules/packages/main.py:59 src/modules/packages/main.py:68 +#: src/modules/packages/main.py:78 +msgid "Install packages." +msgstr "" + +#: src/modules/packages/main.py:66 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:71 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/packages/main.py:74 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/networkcfg/main.py:37 +msgid "Saving network configuration." +msgstr "" + +#: src/modules/networkcfg/main.py:48 src/modules/initcpiocfg/main.py:205 +#: src/modules/initcpiocfg/main.py:209 src/modules/openrcdmcryptcfg/main.py:78 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/localecfg/main.py:144 +#: src/modules/mount/main.py:145 src/modules/luksopenswaphookcfg/main.py:95 +#: src/modules/luksopenswaphookcfg/main.py:99 src/modules/fstab/main.py:332 +#: src/modules/fstab/main.py:338 src/modules/initramfscfg/main.py:94 +#: src/modules/initramfscfg/main.py:98 src/modules/rawfs/main.py:171 +msgid "Configuration Error" +msgstr "" + +#: src/modules/networkcfg/main.py:49 src/modules/initcpiocfg/main.py:210 +#: src/modules/openrcdmcryptcfg/main.py:83 src/modules/localecfg/main.py:145 +#: src/modules/luksopenswaphookcfg/main.py:100 src/modules/fstab/main.py:339 +#: src/modules/initramfscfg/main.py:99 +msgid "No root mount point is given for
{!s}
to use." +msgstr "" + +#: src/modules/umount/main.py:40 +msgid "Unmount file systems." +msgstr "" + +#: src/modules/initcpiocfg/main.py:37 +msgid "Configuring mkinitcpio." +msgstr "" + +#: src/modules/initcpiocfg/main.py:206 src/modules/openrcdmcryptcfg/main.py:79 +#: src/modules/mount/main.py:146 src/modules/luksopenswaphookcfg/main.py:96 +#: src/modules/fstab/main.py:333 src/modules/initramfscfg/main.py:95 +#: src/modules/rawfs/main.py:172 +msgid "No partitions are defined for
{!s}
to use." +msgstr "" + +#: src/modules/openrcdmcryptcfg/main.py:34 +msgid "Configuring OpenRC dmcrypt service." +msgstr "" + +#: src/modules/unpackfs/main.py:44 +msgid "Filling up filesystems." +msgstr "" + +#: src/modules/unpackfs/main.py:257 +msgid "rsync failed with error code {}." +msgstr "" + +#: src/modules/unpackfs/main.py:302 +msgid "Unpacking image {}/{}, file {}/{}" +msgstr "" + +#: src/modules/unpackfs/main.py:317 +msgid "Starting to unpack {}" +msgstr "" + +#: src/modules/unpackfs/main.py:326 src/modules/unpackfs/main.py:432 +msgid "Failed to unpack image \"{}\"" +msgstr "" + +#: src/modules/unpackfs/main.py:399 +msgid "No mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:400 +msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:405 +msgid "Bad mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:406 +msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:422 src/modules/unpackfs/main.py:426 +#: src/modules/unpackfs/main.py:446 +msgid "Bad unsquash configuration" +msgstr "" + +#: src/modules/unpackfs/main.py:423 +msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" +msgstr "" + +#: src/modules/unpackfs/main.py:427 +msgid "The source filesystem \"{}\" does not exist" +msgstr "" + +#: src/modules/unpackfs/main.py:433 +msgid "" +"Failed to find unsquashfs, make sure you have the squashfs-tools package " +"installed" +msgstr "" + +#: src/modules/unpackfs/main.py:447 +msgid "The destination \"{}\" in the target system is not a directory" +msgstr "" + +#: src/modules/services-systemd/main.py:35 +msgid "Configure systemd services" +msgstr "" + +#: src/modules/services-systemd/main.py:68 +#: src/modules/services-openrc/main.py:102 +msgid "Cannot modify service" +msgstr "" + +#: src/modules/services-systemd/main.py:69 +msgid "" +"systemctl {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:72 +#: src/modules/services-systemd/main.py:76 +msgid "Cannot enable systemd service {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:74 +msgid "Cannot enable systemd target {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:78 +msgid "Cannot disable systemd target {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:80 +msgid "Cannot mask systemd unit {name!s}." +msgstr "" + +#: src/modules/services-systemd/main.py:82 +msgid "" +"Unknown systemd commands {command!s} and " +"{suffix!s} for unit {name!s}." +msgstr "" + +#: src/modules/dummypython/main.py:44 +msgid "Dummy python job." +msgstr "" + +#: src/modules/dummypython/main.py:46 src/modules/dummypython/main.py:102 +#: src/modules/dummypython/main.py:103 +msgid "Dummy python step {}" +msgstr "" + +#: src/modules/bootloader/main.py:51 +msgid "Install bootloader." +msgstr "" + +#: src/modules/localecfg/main.py:39 +msgid "Configuring locales." +msgstr "" + +#: src/modules/mount/main.py:38 +msgid "Mounting partitions." +msgstr "" + +#: src/modules/plymouthcfg/main.py:36 +msgid "Configure Plymouth theme" +msgstr "" + +#: src/modules/luksopenswaphookcfg/main.py:35 +msgid "Configuring encrypted swap." +msgstr "" + +#: src/modules/fstab/main.py:38 +msgid "Writing fstab." +msgstr "" + +#: src/modules/services-openrc/main.py:38 +msgid "Configure OpenRC services" +msgstr "" + +#: src/modules/services-openrc/main.py:66 +msgid "Cannot add service {name!s} to run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:68 +msgid "Cannot remove service {name!s} from run-level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:70 +msgid "" +"Unknown service-action {arg!s} for service {name!s} in run-" +"level {level!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:103 +msgid "" +"rc-update {arg!s} call in chroot returned error code {num!s}." +msgstr "" + +#: src/modules/services-openrc/main.py:110 +msgid "Target runlevel does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:111 +msgid "" +"The path for runlevel {level!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/services-openrc/main.py:119 +msgid "Target service does not exist" +msgstr "" + +#: src/modules/services-openrc/main.py:120 +msgid "" +"The path for service {name!s} is {path!s}, which does not " +"exist." +msgstr "" + +#: src/modules/dracut/main.py:36 +msgid "Creating initramfs with dracut." +msgstr "" + +#: src/modules/dracut/main.py:58 +msgid "Failed to run dracut on the target" +msgstr "" + +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + +#: src/modules/grubcfg/main.py:37 +msgid "Configure GRUB." +msgstr "" + +#: src/modules/displaymanager/main.py:515 +msgid "Cannot write KDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:516 +msgid "KDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:577 +msgid "Cannot write LXDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:578 +msgid "LXDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:661 +msgid "Cannot write LightDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:662 +msgid "LightDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:736 +msgid "Cannot configure LightDM" +msgstr "" + +#: src/modules/displaymanager/main.py:737 +msgid "No LightDM greeter installed." +msgstr "" + +#: src/modules/displaymanager/main.py:768 +msgid "Cannot write SLIM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:769 +msgid "SLIM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:895 +msgid "No display managers selected for the displaymanager module." +msgstr "" + +#: src/modules/displaymanager/main.py:896 +msgid "" +"The displaymanagers list is empty or undefined in bothglobalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:978 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/initramfscfg/main.py:41 +msgid "Configuring initramfs." +msgstr "" + +#: src/modules/hwclock/main.py:35 +msgid "Setting hardware clock." +msgstr "" + +#: src/modules/rawfs/main.py:35 +msgid "Installing data." +msgstr "" diff --git a/lang/python/hi/LC_MESSAGES/python.mo b/lang/python/hi/LC_MESSAGES/python.mo index 2732db6edb9ccc6419583a2b8ef473ca77c0a4b6..8b12ae6dcc5a26193270026013bc989f3e606943 100644 GIT binary patch delta 1781 zcmY+?drVtZ9Ki9@hPrjiHkg0~Mh~wE4g!HqC!k}K4YzE;Igu@6LD)(|SSj{lg0(60 zwHf9kT*)K>634BZB$AEBS6ooDXrll4NSIlS=HfzPG$#6w$zptbf4yDInp{5Tcev;G zJLh-LrOs~;Cw|P$no#`Od5U=+b1Kz~XR`RiZ~bjb?Zupo-B?C^9t-hHY{V733q7lp z+JX%k{V4yR!aDpK^H8l;YMW9CmCvA@xC1LNjCbQ3nfMdjK)izM@CJI&?Y0Y+qim!F zB~KR?VGQ%}EZ&LpSb$g1i{E1n_0?Yta+s)EW53vhj}mvFob((@!p~3=ETe4b2FkkZ z+vyT|QBGcuvJoH3fnGv6&^*dUuHr`g6`QHA+;=Edio0+t`jOVCY21ugu^ye-cEU!K z1cy*I^b|@DMX_Bin<%DV41(ElidV*1jFr+ zOvsKlbCZtaFgD>5K8)+R01_X@E%-W0;V)1URTkR?dvJ#MGPdIpzSBOO#X9^QTTt_z zw&KwQg9Zi$&f(|SflqpsdIUekgP5!B_xe#bIEnA$Kj_Ez_%6?32{-mlJcrWyHg2MH z^gK$wnhJY;9JdoEe#%UgRVuZIiBtFxeuF15Z#M9`!$Id&3gTzb7ztj$HHu>*WgAAsb_zidCSdCH+bn-~6;tM zR*_?yF_~3fDyJyT%nR(3toHYoxXt(>t0-p&qh=ner+>Q)x2wo4pN=b{+KpOQL3S%6 zIXW9q_ZbIV<&GvJ>Z)_>Hj=JJ#{;Qrt`}D29gOsbA_GHy9SQ2_&~WduK^==5N3;KE z?H@Sd3y*{&zJTrzhICmhUZ$&J@oGH~)bNUK%m#}BY9mcUZW+sJx(pJ+vjjL)Tiol0;^NAo@;BovADL( z53S@W%QUUzNrDe7^I6NBvy!7$a?1FssI2@&%e7-< zeQVC-jIn>Cx0^h3mN`K&mc1)Ek}peHbKWu+E%O4i6E|lsq_?!d)LZGdc%4_My2un; zWQn~zX_+6B#JE&Zkm}pC=rsN=Em delta 1334 zcmXZbTSyd97{Ku}>#mp0^_G`(tzA>oys(w6x~ZutR%>DymXei5P?#bKQJA?&7kUV~ zOukr2LHSTb*dS892ti;9mC;40$f&4?ZV1ssLH}>Z12ez#&Fp;VobQ~SZXRh2yo<9A zC|WgFDp#pRsWxn}a-+SsDdor6dGkV*T1tEfQ*aOqa1aNm4<4i^%SVl+-*GR~k3IEONk$Otn}7CMP*F%kD-JoaG{ z>gd8-n8)~Pl1?lS{-FHOZda-ST_`Kcm_e#uYe?k}$+!CdfvaPz^4@o%7F+Vkz+@ zY{Azk1AC*Csz*Q8;UET<)A>TD3FD}5EAB_xqbcN-`heB=3rnz&<+`yOdo)UlyNRRX z%(HUFq;jO_!w@--zY0;VA;Fy z4oV!&LCD4q%*O#N$A{>{5DrWQmSHXS;U0XPO#Ro;@o<7RU^_}|pzP&$l!4QoW}*Pf zfcJ0+6H}F1kE6H=|Dgx{Y;Y;|pclt*6@J5;=w`p_aWX(>GaaW(sV&%n^22eI8P4Gt zHn};;7{ft1j)(CY{zWPM5GPeis_|Ene5X*pe}&~(nxWK2?8Pd4g#8$>XHsrDXV8u1 z%gg~*koUWO?TLwv9c!FD6$9JI^Ab;MikR$%T=|$!>$55O bMpueq*Pmr37?(4jXhuTzxW%Z, YEAR. # # Translators: -# Panwar108 , 2019 +# Panwar108 , 2020 # #, fuzzy msgid "" @@ -13,7 +13,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-30 23:13+0200\n" "PO-Revision-Date: 2017-08-09 10:34+0000\n" -"Last-Translator: Panwar108 , 2019\n" +"Last-Translator: Panwar108 , 2020\n" "Language-Team: Hindi (https://www.transifex.com/calamares/teams/20061/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -84,7 +84,7 @@ msgstr "
{!s}
के उपयोग हेतु कोई विभ #: src/modules/openrcdmcryptcfg/main.py:34 msgid "Configuring OpenRC dmcrypt service." -msgstr "OpenRC dmcrypt सेवा को विन्यस्त करना।" +msgstr "OpenRC dmcrypt सेवा विन्यस्त करना।" #: src/modules/unpackfs/main.py:44 msgid "Filling up filesystems." @@ -96,11 +96,11 @@ msgstr "rsync त्रुटि कोड {} के साथ विफल।" #: src/modules/unpackfs/main.py:302 msgid "Unpacking image {}/{}, file {}/{}" -msgstr "" +msgstr "इमेज फ़ाइल {}/{}, फ़ाइल {}/{} सम्पीड़ित की जा रही है" #: src/modules/unpackfs/main.py:317 msgid "Starting to unpack {}" -msgstr "" +msgstr "{} हेतु संपीड़न प्रक्रिया आरंभ हो रही है " #: src/modules/unpackfs/main.py:326 src/modules/unpackfs/main.py:432 msgid "Failed to unpack image \"{}\"" @@ -129,7 +129,7 @@ msgstr "ख़राब unsquash विन्यास सेटिंग्स" #: src/modules/unpackfs/main.py:423 msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" -msgstr "" +msgstr "\"{}\" ({}) हेतु फ़ाइल सिस्टम आपके वर्तमान कर्नेल द्वारा समर्थित नहीं है" #: src/modules/unpackfs/main.py:427 msgid "The source filesystem \"{}\" does not exist" From c284024b0eb28c616c1699377ad5213571585819 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 18 Jun 2020 15:47:18 +0200 Subject: [PATCH 60/63] i18n: Update English translations --- lang/calamares_en.ts | 544 +++++++++++------- lang/python.pot | 486 ++++++++-------- .../dummypythonqt/lang/dummypythonqt.pot | 18 +- 3 files changed, 575 insertions(+), 473 deletions(-) diff --git a/lang/calamares_en.ts b/lang/calamares_en.ts index 08ff2436c..ec80837bd 100644 --- a/lang/calamares_en.ts +++ b/lang/calamares_en.ts @@ -117,12 +117,12 @@ Calamares::ExecutionViewStep - + Set up Set up - + Install Install @@ -130,12 +130,12 @@ Calamares::FailJob - + Job failed (%1) Job failed (%1) - + Programmed job failure was explicitly requested. Programmed job failure was explicitly requested. @@ -143,7 +143,7 @@ Calamares::JobThread - + Done Done @@ -151,7 +151,7 @@ Calamares::NamedJob - + Example job (%1) Example job (%1) @@ -159,17 +159,17 @@ Calamares::ProcessJob - + Run command '%1' in target system. Run command '%1' in target system. - + Run command '%1'. Run command '%1'. - + Running command %1 %2 Running command %1 %2 @@ -177,32 +177,32 @@ Calamares::PythonJob - + Running %1 operation. Running %1 operation. - + Bad working directory path Bad working directory path - + Working directory %1 for python job %2 is not readable. Working directory %1 for python job %2 is not readable. - + Bad main script file Bad main script file - + Main script file %1 for python job %2 is not readable. Main script file %1 for python job %2 is not readable. - + Boost.Python error in job "%1". Boost.Python error in job "%1". @@ -227,8 +227,13 @@ Calamares::RequirementsChecker + + + Requirements checking for module <i>%1</i> is complete. + Requirements checking for module <i>%1</i> is complete. + - + Waiting for %n module(s). Waiting for %n module(s). @@ -236,7 +241,7 @@ - + (%n second(s)) (%n second(s)) @@ -244,7 +249,7 @@ - + System-requirements checking is complete. System-requirements checking is complete. @@ -273,13 +278,13 @@ - + &Yes &Yes - + &No &No @@ -314,109 +319,109 @@ <br/>The following modules could not be loaded: - + Continue with setup? Continue with setup? - + Continue with installation? Continue with installation? - + The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> - + The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + &Set up now &Set up now - + &Install now &Install now - + Go &back Go &back - + &Set up &Set up - + &Install &Install - + Setup is complete. Close the setup program. Setup is complete. Close the setup program. - + The installation is complete. Close the installer. The installation is complete. Close the installer. - + Cancel setup without changing the system. Cancel setup without changing the system. - + Cancel installation without changing the system. Cancel installation without changing the system. - + &Next &Next - + &Back &Back - + &Done &Done - + &Cancel &Cancel - + Cancel setup? Cancel setup? - + Cancel installation? Cancel installation? - + Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. Do you really want to cancel the current setup process? The setup program will quit and all changes will be lost. - + Do you really want to cancel the current install process? The installer will quit and all changes will be lost. Do you really want to cancel the current install process? @@ -426,22 +431,22 @@ The installer will quit and all changes will be lost. CalamaresPython::Helper - + Unknown exception type Unknown exception type - + unparseable Python error unparseable Python error - + unparseable Python traceback unparseable Python traceback - + Unfetchable Python error. Unfetchable Python error. @@ -459,32 +464,32 @@ The installer will quit and all changes will be lost. CalamaresWindow - + Show debug information Show debug information - + &Back &Back - + &Next &Next - + &Cancel &Cancel - + %1 Setup Program %1 Setup Program - + %1 Installer %1 Installer @@ -681,18 +686,18 @@ The installer will quit and all changes will be lost. CommandList - - + + Could not run command. Could not run command. - + The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + The command needs to know the user's name, but no username is defined. The command needs to know the user's name, but no username is defined. @@ -745,49 +750,49 @@ The installer will quit and all changes will be lost. Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - + This program will ask you some questions and set up %2 on your computer. This program will ask you some questions and set up %2 on your computer. - - <h1>Welcome to the Calamares setup program for %1.</h1> - <h1>Welcome to the Calamares setup program for %1.</h1> + + <h1>Welcome to the Calamares setup program for %1</h1> + - - <h1>Welcome to %1 setup.</h1> - <h1>Welcome to %1 setup.</h1> + + <h1>Welcome to %1 setup</h1> + - - <h1>Welcome to the Calamares installer for %1.</h1> - <h1>Welcome to the Calamares installer for %1.</h1> + + <h1>Welcome to the Calamares installer for %1</h1> + - - <h1>Welcome to the %1 installer.</h1> - <h1>Welcome to the %1 installer.</h1> + + <h1>Welcome to the %1 installer</h1> + @@ -1224,37 +1229,37 @@ The installer will quit and all changes will be lost. FillGlobalStorageJob - + Set partition information Set partition information - + Install %1 on <strong>new</strong> %2 system partition. Install %1 on <strong>new</strong> %2 system partition. - + Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. - + Install %2 on %3 system partition <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. - + Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. - + Install boot loader on <strong>%1</strong>. Install boot loader on <strong>%1</strong>. - + Setting up mount points. Setting up mount points. @@ -1272,32 +1277,32 @@ The installer will quit and all changes will be lost. &Restart now - + <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. - + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> - + <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. - + <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> - + <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. - + <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. @@ -1305,27 +1310,27 @@ The installer will quit and all changes will be lost. FinishedViewStep - + Finish Finish - + Setup Complete Setup Complete - + Installation Complete Installation Complete - + The setup of %1 is complete. The setup of %1 is complete. - + The installation of %1 is complete. The installation of %1 is complete. @@ -1356,72 +1361,72 @@ The installer will quit and all changes will be lost. GeneralRequirements - + has at least %1 GiB available drive space has at least %1 GiB available drive space - + There is not enough drive space. At least %1 GiB is required. There is not enough drive space. At least %1 GiB is required. - + has at least %1 GiB working memory has at least %1 GiB working memory - + The system does not have enough working memory. At least %1 GiB is required. The system does not have enough working memory. At least %1 GiB is required. - + is plugged in to a power source is plugged in to a power source - + The system is not plugged in to a power source. The system is not plugged in to a power source. - + is connected to the Internet is connected to the Internet - + The system is not connected to the Internet. The system is not connected to the Internet. - + is running the installer as an administrator (root) is running the installer as an administrator (root) - + The setup program is not running with administrator rights. The setup program is not running with administrator rights. - + The installer is not running with administrator rights. The installer is not running with administrator rights. - + has a screen large enough to show the whole installer has a screen large enough to show the whole installer - + The screen is too small to display the setup program. The screen is too small to display the setup program. - + The screen is too small to display the installer. The screen is too small to display the installer. @@ -1769,6 +1774,16 @@ The installer will quit and all changes will be lost. No root mount point is set for MachineId. + + Map + + + Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. + + + NetInstallViewStep @@ -1907,6 +1922,19 @@ The installer will quit and all changes will be lost. Set the OEM Batch Identifier to <code>%1</code>. + + Offline + + + Timezone: %1 + + + + + To be able to select a timezone, make sure you are connected to the internet. Restart the installer after connecting. You can fine-tune Language and Locale settings below. + + + PWQ @@ -2494,107 +2522,107 @@ The installer will quit and all changes will be lost. Partitions - + Install %1 <strong>alongside</strong> another operating system. Install %1 <strong>alongside</strong> another operating system. - + <strong>Erase</strong> disk and install %1. <strong>Erase</strong> disk and install %1. - + <strong>Replace</strong> a partition with %1. <strong>Replace</strong> a partition with %1. - + <strong>Manual</strong> partitioning. <strong>Manual</strong> partitioning. - + Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). - + <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - + <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. - + <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). - + Disk <strong>%1</strong> (%2) Disk <strong>%1</strong> (%2) - + Current: Current: - + After: After: - + No EFI system partition configured No EFI system partition configured - + An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. - + An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - + EFI system partition flag not set EFI system partition flag not set - + Option to use GPT on BIOS Option to use GPT on BIOS - + A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>bios_grub</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>bios_grub</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. - + Boot partition not encrypted Boot partition not encrypted - + A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. - + has at least one disk device available. has at least one disk device available. - + There are no partitions to install on. There are no partitions to install on. @@ -2660,14 +2688,14 @@ The installer will quit and all changes will be lost. ProcessResult - + There was no output from the command. There was no output from the command. - + Output: @@ -2676,52 +2704,52 @@ Output: - + External command crashed. External command crashed. - + Command <i>%1</i> crashed. Command <i>%1</i> crashed. - + External command failed to start. External command failed to start. - + Command <i>%1</i> failed to start. Command <i>%1</i> failed to start. - + Internal error when starting command. Internal error when starting command. - + Bad parameters for process job call. Bad parameters for process job call. - + External command failed to finish. External command failed to finish. - + Command <i>%1</i> failed to finish in %2 seconds. Command <i>%1</i> failed to finish in %2 seconds. - + External command finished with errors. External command finished with errors. - + Command <i>%1</i> finished with exit code %2. Command <i>%1</i> finished with exit code %2. @@ -2729,32 +2757,27 @@ Output: QObject - + %1 (%2) %1 (%2) - - Requirements checking for module <i>%1</i> is complete. - Requirements checking for module <i>%1</i> is complete. - - - + unknown unknown - + extended extended - + unformatted unformatted - + swap swap @@ -2808,6 +2831,15 @@ Output: Unpartitioned space or unknown partition table + + Recommended + + + <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> + + + RemoveUserJob @@ -2843,73 +2875,88 @@ Output: Form - + Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. - + The selected item does not appear to be a valid partition. The selected item does not appear to be a valid partition. - + %1 cannot be installed on empty space. Please select an existing partition. %1 cannot be installed on empty space. Please select an existing partition. - + %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. - + %1 cannot be installed on this partition. %1 cannot be installed on this partition. - + Data partition (%1) Data partition (%1) - + Unknown system partition (%1) Unknown system partition (%1) - + %1 system partition (%2) %1 system partition (%2) - + <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. - + <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. - - - + + + <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. - + The EFI system partition at %1 will be used for starting %2. The EFI system partition at %1 will be used for starting %2. - + EFI system partition: EFI system partition: + + Requirements + + + <p>This computer does not satisfy the minimum requirements for installing %1.<br/> + Installation cannot continue.</p> + + + + + <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> + + + ResizeFSJob @@ -3032,12 +3079,12 @@ Output: ResultsListDialog - + For best results, please ensure that this computer: For best results, please ensure that this computer: - + System requirements System requirements @@ -3045,27 +3092,27 @@ Output: ResultsListWidget - + This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. <a href="#details">Details...</a> - + This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - + This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. - + This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - + This program will ask you some questions and set up %2 on your computer. This program will ask you some questions and set up %2 on your computer. @@ -3348,53 +3395,82 @@ Output: TrackingInstallJob - + Installation feedback Installation feedback - + Sending installation feedback. Sending installation feedback. - + Internal error in install-tracking. Internal error in install-tracking. - + HTTP request timed out. HTTP request timed out. - TrackingMachineNeonJob + TrackingKUserFeedbackJob - + + KDE user feedback + + + + + Configuring KDE user feedback. + + + + + + Error in KDE user feedback configuration. + + + + + Could not configure KDE user feedback correctly, script error %1. + + + + + Could not configure KDE user feedback correctly, Calamares error %1. + + + + + TrackingMachineUpdateManagerJob + + Machine feedback - Machine feedback + Machine feedback - + Configuring machine feedback. - Configuring machine feedback. + Configuring machine feedback. - - + + Error in machine feedback configuration. - Error in machine feedback configuration. + Error in machine feedback configuration. - + Could not configure machine feedback correctly, script error %1. - Could not configure machine feedback correctly, script error %1. + Could not configure machine feedback correctly, script error %1. - + Could not configure machine feedback correctly, Calamares error %1. - Could not configure machine feedback correctly, Calamares error %1. + Could not configure machine feedback correctly, Calamares error %1. @@ -3411,8 +3487,8 @@ Output: - <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> - <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> + <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> + @@ -3420,30 +3496,30 @@ Output: <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> - - Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. - Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. + + Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. + - - By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. - By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. + + By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. + - - By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. + + By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. + - - By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. + + By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. + TrackingViewStep - + Feedback Feedback @@ -3629,42 +3705,42 @@ Output: &Release notes - + <h1>Welcome to the Calamares setup program for %1.</h1> <h1>Welcome to the Calamares setup program for %1.</h1> - + <h1>Welcome to %1 setup.</h1> <h1>Welcome to %1 setup.</h1> - + <h1>Welcome to the Calamares installer for %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> - + <h1>Welcome to the %1 installer.</h1> <h1>Welcome to the %1 installer.</h1> - + %1 support %1 support - + About %1 setup About %1 setup - + About %1 installer About %1 installer - + <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017-2020 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. @@ -3672,7 +3748,7 @@ Output: WelcomeQmlViewStep - + Welcome Welcome @@ -3680,7 +3756,7 @@ Output: WelcomeViewStep - + Welcome Welcome @@ -3720,6 +3796,26 @@ Output: Back + + i18n + + + <h1>Languages</h1> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. + + + + + <h1>Locales</h1> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. + + + + + Back + Back + + keyboardq @@ -3765,6 +3861,24 @@ Output: Test your keyboard + + localeq + + + System language set to %1 + + + + + Numbers and dates locale set to %1 + + + + + Change + + + notesqml @@ -3838,27 +3952,27 @@ Output: <p>This program will ask you some questions and set up %1 on your computer.</p> - + About About - + Support Support - + Known issues Known issues - + Release notes Release notes - + Donate Donate diff --git a/lang/python.pot b/lang/python.pot index 633f658fb..893f3d17f 100644 --- a/lang/python.pot +++ b/lang/python.pot @@ -2,350 +2,338 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-04-30 23:13+0200\n" +"POT-Creation-Date: 2020-06-18 15:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/modules/packages/main.py:59 src/modules/packages/main.py:68 -#: src/modules/packages/main.py:78 -msgid "Install packages." -msgstr "Install packages." - -#: src/modules/packages/main.py:66 -#, python-format -msgid "Processing packages (%(count)d / %(total)d)" -msgstr "Processing packages (%(count)d / %(total)d)" - -#: src/modules/packages/main.py:71 -#, python-format -msgid "Installing one package." -msgid_plural "Installing %(num)d packages." -msgstr[0] "Installing one package." -msgstr[1] "Installing %(num)d packages." - -#: src/modules/packages/main.py:74 -#, python-format -msgid "Removing one package." -msgid_plural "Removing %(num)d packages." -msgstr[0] "Removing one package." -msgstr[1] "Removing %(num)d packages." - -#: src/modules/networkcfg/main.py:37 -msgid "Saving network configuration." -msgstr "Saving network configuration." - -#: src/modules/networkcfg/main.py:48 src/modules/initcpiocfg/main.py:205 -#: src/modules/initcpiocfg/main.py:209 src/modules/openrcdmcryptcfg/main.py:78 -#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/localecfg/main.py:144 -#: src/modules/mount/main.py:145 src/modules/luksopenswaphookcfg/main.py:95 -#: src/modules/luksopenswaphookcfg/main.py:99 src/modules/fstab/main.py:332 -#: src/modules/fstab/main.py:338 src/modules/initramfscfg/main.py:94 -#: src/modules/initramfscfg/main.py:98 src/modules/rawfs/main.py:171 -msgid "Configuration Error" -msgstr "Configuration Error" - -#: src/modules/networkcfg/main.py:49 src/modules/initcpiocfg/main.py:210 -#: src/modules/openrcdmcryptcfg/main.py:83 src/modules/localecfg/main.py:145 -#: src/modules/luksopenswaphookcfg/main.py:100 src/modules/fstab/main.py:339 -#: src/modules/initramfscfg/main.py:99 -msgid "No root mount point is given for
{!s}
to use." -msgstr "No root mount point is given for
{!s}
to use." - -#: src/modules/umount/main.py:40 -msgid "Unmount file systems." -msgstr "Unmount file systems." - -#: src/modules/initcpiocfg/main.py:37 -msgid "Configuring mkinitcpio." -msgstr "Configuring mkinitcpio." - -#: src/modules/initcpiocfg/main.py:206 src/modules/openrcdmcryptcfg/main.py:79 -#: src/modules/mount/main.py:146 src/modules/luksopenswaphookcfg/main.py:96 -#: src/modules/fstab/main.py:333 src/modules/initramfscfg/main.py:95 -#: src/modules/rawfs/main.py:172 -msgid "No partitions are defined for
{!s}
to use." -msgstr "No partitions are defined for
{!s}
to use." - -#: src/modules/openrcdmcryptcfg/main.py:34 -msgid "Configuring OpenRC dmcrypt service." -msgstr "Configuring OpenRC dmcrypt service." - -#: src/modules/unpackfs/main.py:44 -msgid "Filling up filesystems." -msgstr "Filling up filesystems." - -#: src/modules/unpackfs/main.py:257 -msgid "rsync failed with error code {}." -msgstr "rsync failed with error code {}." - -#: src/modules/unpackfs/main.py:302 -msgid "Unpacking image {}/{}, file {}/{}" -msgstr "Unpacking image {}/{}, file {}/{}" - -#: src/modules/unpackfs/main.py:317 -msgid "Starting to unpack {}" -msgstr "Starting to unpack {}" - -#: src/modules/unpackfs/main.py:326 src/modules/unpackfs/main.py:432 -msgid "Failed to unpack image \"{}\"" -msgstr "Failed to unpack image \"{}\"" - -#: src/modules/unpackfs/main.py:399 -msgid "No mount point for root partition" -msgstr "No mount point for root partition" - -#: src/modules/unpackfs/main.py:400 -msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" -msgstr "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" - -#: src/modules/unpackfs/main.py:405 -msgid "Bad mount point for root partition" -msgstr "Bad mount point for root partition" - -#: src/modules/unpackfs/main.py:406 -msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" -msgstr "rootMountPoint is \"{}\", which does not exist, doing nothing" - -#: src/modules/unpackfs/main.py:422 src/modules/unpackfs/main.py:426 -#: src/modules/unpackfs/main.py:446 -msgid "Bad unsquash configuration" -msgstr "Bad unsquash configuration" - -#: src/modules/unpackfs/main.py:423 -msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" -msgstr "The filesystem for \"{}\" ({}) is not supported by your current kernel" - -#: src/modules/unpackfs/main.py:427 -msgid "The source filesystem \"{}\" does not exist" -msgstr "The source filesystem \"{}\" does not exist" - -#: src/modules/unpackfs/main.py:433 -msgid "" -"Failed to find unsquashfs, make sure you have the squashfs-tools package " -"installed" +#: src/modules/grubcfg/main.py:37 +msgid "Configure GRUB." msgstr "" -"Failed to find unsquashfs, make sure you have the squashfs-tools package " -"installed" -#: src/modules/unpackfs/main.py:447 -msgid "The destination \"{}\" in the target system is not a directory" -msgstr "The destination \"{}\" in the target system is not a directory" +#: src/modules/mount/main.py:38 +msgid "Mounting partitions." +msgstr "" + +#: src/modules/mount/main.py:150 src/modules/initcpiocfg/main.py:205 +#: src/modules/initcpiocfg/main.py:209 +#: src/modules/luksopenswaphookcfg/main.py:95 +#: src/modules/luksopenswaphookcfg/main.py:99 src/modules/rawfs/main.py:173 +#: src/modules/initramfscfg/main.py:94 src/modules/initramfscfg/main.py:98 +#: src/modules/openrcdmcryptcfg/main.py:78 +#: src/modules/openrcdmcryptcfg/main.py:82 src/modules/fstab/main.py:332 +#: src/modules/fstab/main.py:338 src/modules/localecfg/main.py:144 +#: src/modules/networkcfg/main.py:48 +msgid "Configuration Error" +msgstr "" + +#: src/modules/mount/main.py:151 src/modules/initcpiocfg/main.py:206 +#: src/modules/luksopenswaphookcfg/main.py:96 src/modules/rawfs/main.py:174 +#: src/modules/initramfscfg/main.py:95 src/modules/openrcdmcryptcfg/main.py:79 +#: src/modules/fstab/main.py:333 +msgid "No partitions are defined for
{!s}
to use." +msgstr "" #: src/modules/services-systemd/main.py:35 msgid "Configure systemd services" -msgstr "Configure systemd services" +msgstr "" #: src/modules/services-systemd/main.py:68 #: src/modules/services-openrc/main.py:102 msgid "Cannot modify service" -msgstr "Cannot modify service" +msgstr "" #: src/modules/services-systemd/main.py:69 msgid "" "systemctl {arg!s} call in chroot returned error code {num!s}." msgstr "" -"systemctl {arg!s} call in chroot returned error code {num!s}." #: src/modules/services-systemd/main.py:72 #: src/modules/services-systemd/main.py:76 msgid "Cannot enable systemd service {name!s}." -msgstr "Cannot enable systemd service {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:74 msgid "Cannot enable systemd target {name!s}." -msgstr "Cannot enable systemd target {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:78 msgid "Cannot disable systemd target {name!s}." -msgstr "Cannot disable systemd target {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:80 msgid "Cannot mask systemd unit {name!s}." -msgstr "Cannot mask systemd unit {name!s}." +msgstr "" #: src/modules/services-systemd/main.py:82 msgid "" -"Unknown systemd commands {command!s} and " -"{suffix!s} for unit {name!s}." +"Unknown systemd commands {command!s} and {suffix!s} for unit {name!s}." msgstr "" -"Unknown systemd commands {command!s} and " -"{suffix!s} for unit {name!s}." -#: src/modules/dummypython/main.py:44 -msgid "Dummy python job." -msgstr "Dummy python job." +#: src/modules/umount/main.py:40 +msgid "Unmount file systems." +msgstr "" -#: src/modules/dummypython/main.py:46 src/modules/dummypython/main.py:102 -#: src/modules/dummypython/main.py:103 -msgid "Dummy python step {}" -msgstr "Dummy python step {}" +#: src/modules/unpackfs/main.py:44 +msgid "Filling up filesystems." +msgstr "" -#: src/modules/bootloader/main.py:51 -msgid "Install bootloader." -msgstr "Install bootloader." +#: src/modules/unpackfs/main.py:257 +msgid "rsync failed with error code {}." +msgstr "" -#: src/modules/localecfg/main.py:39 -msgid "Configuring locales." -msgstr "Configuring locales." +#: src/modules/unpackfs/main.py:302 +msgid "Unpacking image {}/{}, file {}/{}" +msgstr "" -#: src/modules/mount/main.py:38 -msgid "Mounting partitions." -msgstr "Mounting partitions." +#: src/modules/unpackfs/main.py:317 +msgid "Starting to unpack {}" +msgstr "" -#: src/modules/plymouthcfg/main.py:36 -msgid "Configure Plymouth theme" -msgstr "Configure Plymouth theme" +#: src/modules/unpackfs/main.py:326 src/modules/unpackfs/main.py:448 +msgid "Failed to unpack image \"{}\"" +msgstr "" + +#: src/modules/unpackfs/main.py:415 +msgid "No mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:416 +msgid "globalstorage does not contain a \"rootMountPoint\" key, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:421 +msgid "Bad mount point for root partition" +msgstr "" + +#: src/modules/unpackfs/main.py:422 +msgid "rootMountPoint is \"{}\", which does not exist, doing nothing" +msgstr "" + +#: src/modules/unpackfs/main.py:438 src/modules/unpackfs/main.py:442 +#: src/modules/unpackfs/main.py:462 +msgid "Bad unsquash configuration" +msgstr "" + +#: src/modules/unpackfs/main.py:439 +msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" +msgstr "" + +#: src/modules/unpackfs/main.py:443 +msgid "The source filesystem \"{}\" does not exist" +msgstr "" + +#: src/modules/unpackfs/main.py:449 +msgid "" +"Failed to find unsquashfs, make sure you have the squashfs-tools package " +"installed" +msgstr "" + +#: src/modules/unpackfs/main.py:463 +msgid "The destination \"{}\" in the target system is not a directory" +msgstr "" + +#: src/modules/displaymanager/main.py:523 +msgid "Cannot write KDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:524 +msgid "KDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:585 +msgid "Cannot write LXDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:586 +msgid "LXDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:669 +msgid "Cannot write LightDM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:670 +msgid "LightDM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:744 +msgid "Cannot configure LightDM" +msgstr "" + +#: src/modules/displaymanager/main.py:745 +msgid "No LightDM greeter installed." +msgstr "" + +#: src/modules/displaymanager/main.py:776 +msgid "Cannot write SLIM configuration file" +msgstr "" + +#: src/modules/displaymanager/main.py:777 +msgid "SLIM config file {!s} does not exist" +msgstr "" + +#: src/modules/displaymanager/main.py:903 +msgid "No display managers selected for the displaymanager module." +msgstr "" + +#: src/modules/displaymanager/main.py:904 +msgid "" +"The displaymanagers list is empty or undefined in bothglobalstorage and " +"displaymanager.conf." +msgstr "" + +#: src/modules/displaymanager/main.py:986 +msgid "Display manager configuration was incomplete" +msgstr "" + +#: src/modules/initcpiocfg/main.py:37 +msgid "Configuring mkinitcpio." +msgstr "" + +#: src/modules/initcpiocfg/main.py:210 +#: src/modules/luksopenswaphookcfg/main.py:100 +#: src/modules/initramfscfg/main.py:99 src/modules/openrcdmcryptcfg/main.py:83 +#: src/modules/fstab/main.py:339 src/modules/localecfg/main.py:145 +#: src/modules/networkcfg/main.py:49 +msgid "No root mount point is given for
{!s}
to use." +msgstr "" #: src/modules/luksopenswaphookcfg/main.py:35 msgid "Configuring encrypted swap." -msgstr "Configuring encrypted swap." +msgstr "" -#: src/modules/fstab/main.py:38 -msgid "Writing fstab." -msgstr "Writing fstab." +#: src/modules/rawfs/main.py:35 +msgid "Installing data." +msgstr "" #: src/modules/services-openrc/main.py:38 msgid "Configure OpenRC services" -msgstr "Configure OpenRC services" +msgstr "" #: src/modules/services-openrc/main.py:66 msgid "Cannot add service {name!s} to run-level {level!s}." -msgstr "Cannot add service {name!s} to run-level {level!s}." +msgstr "" #: src/modules/services-openrc/main.py:68 msgid "Cannot remove service {name!s} from run-level {level!s}." -msgstr "Cannot remove service {name!s} from run-level {level!s}." +msgstr "" #: src/modules/services-openrc/main.py:70 msgid "" "Unknown service-action {arg!s} for service {name!s} in run-" "level {level!s}." msgstr "" -"Unknown service-action {arg!s} for service {name!s} in run-" -"level {level!s}." #: src/modules/services-openrc/main.py:103 msgid "" "rc-update {arg!s} call in chroot returned error code {num!s}." msgstr "" -"rc-update {arg!s} call in chroot returned error code {num!s}." #: src/modules/services-openrc/main.py:110 msgid "Target runlevel does not exist" -msgstr "Target runlevel does not exist" +msgstr "" #: src/modules/services-openrc/main.py:111 msgid "" "The path for runlevel {level!s} is {path!s}, which does not " "exist." msgstr "" -"The path for runlevel {level!s} is {path!s}, which does not " -"exist." #: src/modules/services-openrc/main.py:119 msgid "Target service does not exist" -msgstr "Target service does not exist" +msgstr "" #: src/modules/services-openrc/main.py:120 msgid "" -"The path for service {name!s} is {path!s}, which does not " -"exist." +"The path for service {name!s} is {path!s}, which does not exist." msgstr "" -"The path for service {name!s} is {path!s}, which does not " -"exist." -#: src/modules/dracut/main.py:36 -msgid "Creating initramfs with dracut." -msgstr "Creating initramfs with dracut." - -#: src/modules/dracut/main.py:58 -msgid "Failed to run dracut on the target" -msgstr "Failed to run dracut on the target" - -#: src/modules/dracut/main.py:59 -msgid "The exit code was {}" -msgstr "The exit code was {}" - -#: src/modules/grubcfg/main.py:37 -msgid "Configure GRUB." -msgstr "Configure GRUB." - -#: src/modules/displaymanager/main.py:515 -msgid "Cannot write KDM configuration file" -msgstr "Cannot write KDM configuration file" - -#: src/modules/displaymanager/main.py:516 -msgid "KDM config file {!s} does not exist" -msgstr "KDM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:577 -msgid "Cannot write LXDM configuration file" -msgstr "Cannot write LXDM configuration file" - -#: src/modules/displaymanager/main.py:578 -msgid "LXDM config file {!s} does not exist" -msgstr "LXDM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:661 -msgid "Cannot write LightDM configuration file" -msgstr "Cannot write LightDM configuration file" - -#: src/modules/displaymanager/main.py:662 -msgid "LightDM config file {!s} does not exist" -msgstr "LightDM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:736 -msgid "Cannot configure LightDM" -msgstr "Cannot configure LightDM" - -#: src/modules/displaymanager/main.py:737 -msgid "No LightDM greeter installed." -msgstr "No LightDM greeter installed." - -#: src/modules/displaymanager/main.py:768 -msgid "Cannot write SLIM configuration file" -msgstr "Cannot write SLIM configuration file" - -#: src/modules/displaymanager/main.py:769 -msgid "SLIM config file {!s} does not exist" -msgstr "SLIM config file {!s} does not exist" - -#: src/modules/displaymanager/main.py:895 -msgid "No display managers selected for the displaymanager module." -msgstr "No display managers selected for the displaymanager module." - -#: src/modules/displaymanager/main.py:896 -msgid "" -"The displaymanagers list is empty or undefined in bothglobalstorage and " -"displaymanager.conf." +#: src/modules/plymouthcfg/main.py:36 +msgid "Configure Plymouth theme" msgstr "" -"The displaymanagers list is empty or undefined in bothglobalstorage and " -"displaymanager.conf." -#: src/modules/displaymanager/main.py:978 -msgid "Display manager configuration was incomplete" -msgstr "Display manager configuration was incomplete" +#: src/modules/packages/main.py:59 src/modules/packages/main.py:68 +#: src/modules/packages/main.py:78 +msgid "Install packages." +msgstr "" -#: src/modules/initramfscfg/main.py:41 -msgid "Configuring initramfs." -msgstr "Configuring initramfs." +#: src/modules/packages/main.py:66 +#, python-format +msgid "Processing packages (%(count)d / %(total)d)" +msgstr "" + +#: src/modules/packages/main.py:71 +#, python-format +msgid "Installing one package." +msgid_plural "Installing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/packages/main.py:74 +#, python-format +msgid "Removing one package." +msgid_plural "Removing %(num)d packages." +msgstr[0] "" +msgstr[1] "" + +#: src/modules/bootloader/main.py:51 +msgid "Install bootloader." +msgstr "" #: src/modules/hwclock/main.py:35 msgid "Setting hardware clock." -msgstr "Setting hardware clock." +msgstr "" -#: src/modules/rawfs/main.py:35 -msgid "Installing data." -msgstr "Installing data." +#: src/modules/dracut/main.py:36 +msgid "Creating initramfs with dracut." +msgstr "" + +#: src/modules/dracut/main.py:58 +msgid "Failed to run dracut on the target" +msgstr "" + +#: src/modules/dracut/main.py:59 +msgid "The exit code was {}" +msgstr "" + +#: src/modules/initramfscfg/main.py:41 +msgid "Configuring initramfs." +msgstr "" + +#: src/modules/openrcdmcryptcfg/main.py:34 +msgid "Configuring OpenRC dmcrypt service." +msgstr "" + +#: src/modules/fstab/main.py:38 +msgid "Writing fstab." +msgstr "" + +#: src/modules/dummypython/main.py:44 +msgid "Dummy python job." +msgstr "" + +#: src/modules/dummypython/main.py:46 src/modules/dummypython/main.py:102 +#: src/modules/dummypython/main.py:103 +msgid "Dummy python step {}" +msgstr "" + +#: src/modules/localecfg/main.py:39 +msgid "Configuring locales." +msgstr "" + +#: src/modules/networkcfg/main.py:37 +msgid "Saving network configuration." +msgstr "" diff --git a/src/modules/dummypythonqt/lang/dummypythonqt.pot b/src/modules/dummypythonqt/lang/dummypythonqt.pot index 59be66f7e..13cc7ada3 100644 --- a/src/modules/dummypythonqt/lang/dummypythonqt.pot +++ b/src/modules/dummypythonqt/lang/dummypythonqt.pot @@ -2,41 +2,41 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-04-30 23:13+0200\n" +"POT-Creation-Date: 2020-06-18 15:42+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" #: src/modules/dummypythonqt/main.py:84 msgid "Click me!" -msgstr "Click me!" +msgstr "" #: src/modules/dummypythonqt/main.py:94 msgid "A new QLabel." -msgstr "A new QLabel." +msgstr "" #: src/modules/dummypythonqt/main.py:97 msgid "Dummy PythonQt ViewStep" -msgstr "Dummy PythonQt ViewStep" +msgstr "" #: src/modules/dummypythonqt/main.py:183 msgid "The Dummy PythonQt Job" -msgstr "The Dummy PythonQt Job" +msgstr "" #: src/modules/dummypythonqt/main.py:186 msgid "This is the Dummy PythonQt Job. The dummy job says: {}" -msgstr "This is the Dummy PythonQt Job. The dummy job says: {}" +msgstr "" #: src/modules/dummypythonqt/main.py:190 msgid "A status message for Dummy PythonQt Job." -msgstr "A status message for Dummy PythonQt Job." +msgstr "" From 665c425633a5c66f2e110fb8af0ccc4f82610c03 Mon Sep 17 00:00:00 2001 From: demmm Date: Thu, 18 Jun 2020 15:53:38 +0200 Subject: [PATCH 61/63] [CHANGES] add localeq & welcomeq additions --- CHANGES | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES b/CHANGES index 82b70f9af..d50207086 100644 --- a/CHANGES +++ b/CHANGES @@ -25,9 +25,13 @@ This release contains contributions from (alphabetically by first name): - *locale* put some more places into the correct timezone **visually**; for instance Norfolk Island gave up UTC+11.5 in 2015 and is now UTC+11, but Calamares still showed it in a zone separate from UTC+11. + - *localeq* can now properly switch between on & offline mode, + it detects internet status through js. - *packages* gained support for the Void Linux package manager, *xbps*. (thanks Pablo) - *tracking* now supports kuserfeedback configuration. + - *welcomeq* added the GEOIP configuration option, so locale can be + initially set according to IP address. # 3.2.25 (2020-06-06) # From 463545290e1586b0055e73b6471fc9692b93f764 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 18 Jun 2020 16:12:12 +0200 Subject: [PATCH 62/63] [users] Fix up schema syntax - Remove schema items *availableShells* and *avatarFilePath* because those have no implementation. --- src/modules/users/users.conf | 2 +- src/modules/users/users.schema.yaml | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/modules/users/users.conf b/src/modules/users/users.conf index 174a60142..32f74978a 100644 --- a/src/modules/users/users.conf +++ b/src/modules/users/users.conf @@ -124,7 +124,7 @@ allowWeakPasswordsDefault: false # and rely on a correct configuration file in /etc/default/useradd # - set, non-empty, use that path as shell. No validation is done # that the shell actually exists or is executable. -# userShell: /bin/bash +userShell: /bin/bash # Hostname setting # diff --git a/src/modules/users/users.schema.yaml b/src/modules/users/users.schema.yaml index b667df7f6..a3bba5078 100644 --- a/src/modules/users/users.schema.yaml +++ b/src/modules/users/users.schema.yaml @@ -4,15 +4,15 @@ $id: https://calamares.io/schemas/users additionalProperties: false type: object properties: - "defaultGroups": - required: true - type: seq - sequence: - - { type: str } - "autologinGroup": { type: string, required: true } - "doAutologin": { type: boolean, default: true } - "sudoersGroup": { type: string, required: true } - "setRootPassword": { type: boolean, default: true } - "availableShells": { type: str } - "avatarFilePath": { type: str } - "doReusePassword": { type: boolean, default: true } + defaultGroups: + type: array + items: { type: string } + autologinGroup: { type: string } + doAutologin: { type: boolean, default: true } + sudoersGroup: { type: string } + setRootPassword: { type: boolean, default: true } + doReusePassword: { type: boolean, default: true } +required: + - defaultGroups + - autologinGroup + - sudoersGroup From 5da201246554e739ec2771773b1b72464035ff19 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 18 Jun 2020 16:23:32 +0200 Subject: [PATCH 63/63] [users] Expand schema to support the keys documented in users.conf - Now the documentation in the file and the source is leading to update the schema, but in future those should go hand-in-hand --- src/modules/users/users.schema.yaml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/modules/users/users.schema.yaml b/src/modules/users/users.schema.yaml index a3bba5078..44cb9f71c 100644 --- a/src/modules/users/users.schema.yaml +++ b/src/modules/users/users.schema.yaml @@ -4,14 +4,34 @@ $id: https://calamares.io/schemas/users additionalProperties: false type: object properties: + # User shell, should be path to /bin/sh or so + userShell: { type: string } + # Group settings defaultGroups: type: array items: { type: string } autologinGroup: { type: string } - doAutologin: { type: boolean, default: true } sudoersGroup: { type: string } + # Skip login (depends on displaymanager support) + doAutologin: { type: boolean, default: true } + # Root password separate from user password? setRootPassword: { type: boolean, default: true } doReusePassword: { type: boolean, default: true } + # Passwords that don't pass a quality test + allowWeakPasswords: { type: boolean, default: false } + allowWeakPasswordsDefault: { type: boolean, default: false } + passwordRequirements: + additionalProperties: false + type: object + properties: + nonempty: { type: boolean, default: true } + minLength: { type: number } + maxLength: { type: number } + libpwquality: { type: array, items: { type: string } } # Don't know what libpwquality supports + # Hostname setting + setHostname: { type: string, enum: [ None, EtcFile, Hostnamed ] } + writeHostsFile: { type: boolean, default: true } + required: - defaultGroups - autologinGroup