Compare commits
No commits in common. 'ubuntu/noble' and 'ubuntu/kinetic' have entirely different histories.
ubuntu/nob
...
ubuntu/kin
@ -1,427 +0,0 @@
|
||||
--- a/src/modules/users/Config.cpp
|
||||
+++ b/src/modules/users/Config.cpp
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include "Config.h"
|
||||
|
||||
+#include "ActiveDirectoryJob.h"
|
||||
#include "CreateUserJob.h"
|
||||
#include "MiscJobs.h"
|
||||
#include "SetHostNameJob.h"
|
||||
@@ -656,6 +657,59 @@ Config::setRootPasswordSecondary( const
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+Config::setActiveDirectoryUsed( bool used )
|
||||
+{
|
||||
+ m_activeDirectoryUsed = used;
|
||||
+}
|
||||
+
|
||||
+bool
|
||||
+Config::getActiveDirectoryEnabled() const
|
||||
+{
|
||||
+ return m_activeDirectory;
|
||||
+}
|
||||
+
|
||||
+bool
|
||||
+Config::getActiveDirectoryUsed() const
|
||||
+{
|
||||
+ return m_activeDirectoryUsed && m_activeDirectory;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+Config::setActiveDirectoryAdminUsername( const QString & s )
|
||||
+{
|
||||
+ m_activeDirectoryUsername = s;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+Config::setActiveDirectoryAdminPassword( const QString & s )
|
||||
+{
|
||||
+ m_activeDirectoryPassword = s;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+Config::setActiveDirectoryDomain( const QString & s )
|
||||
+{
|
||||
+ m_activeDirectoryDomain = s;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+Config::setActiveDirectoryIP( const QString & s )
|
||||
+{
|
||||
+ m_activeDirectoryIP = s;
|
||||
+}
|
||||
+
|
||||
+QStringList&
|
||||
+Config::getActiveDirectory() const
|
||||
+{
|
||||
+ m_activeDirectorySettings.clear();
|
||||
+ m_activeDirectorySettings << m_activeDirectoryUsername
|
||||
+ << m_activeDirectoryPassword
|
||||
+ << m_activeDirectoryDomain
|
||||
+ << m_activeDirectoryIP;
|
||||
+ return m_activeDirectorySettings;
|
||||
+}
|
||||
+
|
||||
QString
|
||||
Config::rootPassword() const
|
||||
{
|
||||
@@ -913,6 +967,9 @@ Config::setConfigurationMap( const QVari
|
||||
m_sudoStyle = Calamares::getBool( configurationMap, "sudoersConfigureWithGroup", false ) ? SudoStyle::UserAndGroup
|
||||
: SudoStyle::UserOnly;
|
||||
|
||||
+ // Handle Active Directory enablement
|
||||
+ m_activeDirectory = Calamares::getBool( configurationMap, "allowActiveDirectory", false );
|
||||
+
|
||||
// Handle *hostname* key and subkeys and legacy settings
|
||||
{
|
||||
bool ok = false; // Ignored
|
||||
@@ -990,6 +1047,9 @@ Config::createJobs() const
|
||||
jobs.append( Calamares::job_ptr( j ) );
|
||||
}
|
||||
|
||||
+ j = new ActiveDirectoryJob( getActiveDirectory() );
|
||||
+ jobs.append( Calamares::job_ptr( j ) );
|
||||
+
|
||||
j = new SetupGroupsJob( this );
|
||||
jobs.append( Calamares::job_ptr( j ) );
|
||||
|
||||
--- a/src/modules/users/Config.h
|
||||
+++ b/src/modules/users/Config.h
|
||||
@@ -226,6 +226,12 @@ public:
|
||||
bool permitWeakPasswords() const { return m_permitWeakPasswords; }
|
||||
/// Current setting for "require strong password"?
|
||||
bool requireStrongPasswords() const { return m_requireStrongPasswords; }
|
||||
+ /// Is Active Directory enabled?
|
||||
+ bool getActiveDirectoryEnabled() const;
|
||||
+ /// Is it both enabled and activated?
|
||||
+ bool getActiveDirectoryUsed() const;
|
||||
+ /// Config for Active Directory
|
||||
+ QStringList& getActiveDirectory() const;
|
||||
|
||||
const QList< GroupDescription >& defaultGroups() const { return m_defaultGroups; }
|
||||
/** @brief the names of all the groups for the current user
|
||||
@@ -292,6 +298,12 @@ public Q_SLOTS:
|
||||
void setRootPassword( const QString& );
|
||||
void setRootPasswordSecondary( const QString& );
|
||||
|
||||
+ void setActiveDirectoryUsed( bool used );
|
||||
+ void setActiveDirectoryAdminUsername( const QString& );
|
||||
+ void setActiveDirectoryAdminPassword( const QString& );
|
||||
+ void setActiveDirectoryDomain( const QString& );
|
||||
+ void setActiveDirectoryIP( const QString& );
|
||||
+
|
||||
signals:
|
||||
void userShellChanged( const QString& );
|
||||
void autoLoginGroupChanged( const QString& );
|
||||
@@ -343,6 +355,14 @@ private:
|
||||
|
||||
bool m_isReady = false; ///< Used to reduce readyChanged signals
|
||||
|
||||
+ mutable QStringList m_activeDirectorySettings;
|
||||
+ bool m_activeDirectory = false;
|
||||
+ bool m_activeDirectoryUsed = false;
|
||||
+ QString m_activeDirectoryUsername;
|
||||
+ QString m_activeDirectoryPassword;
|
||||
+ QString m_activeDirectoryDomain;
|
||||
+ QString m_activeDirectoryIP;
|
||||
+
|
||||
HostNameAction m_hostnameAction = HostNameAction::EtcHostname;
|
||||
bool m_writeEtcHosts = false;
|
||||
QString m_hostnameTemplate;
|
||||
--- a/src/modules/users/page_usersetup.ui
|
||||
+++ b/src/modules/users/page_usersetup.ui
|
||||
@@ -604,6 +604,93 @@ SPDX-License-Identifier: GPL-3.0-or-late
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
+ <spacer name="verticalSpacer_3">
|
||||
+ <property name="orientation">
|
||||
+ <enum>Qt::Vertical</enum>
|
||||
+ </property>
|
||||
+ <property name="sizeType">
|
||||
+ <enum>QSizePolicy::Fixed</enum>
|
||||
+ </property>
|
||||
+ <property name="sizeHint" stdset="0">
|
||||
+ <size>
|
||||
+ <width>20</width>
|
||||
+ <height>6</height>
|
||||
+ </size>
|
||||
+ </property>
|
||||
+ </spacer>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <layout class="QVBoxLayout" name="verticalLayout">
|
||||
+ <item>
|
||||
+ <widget class="QCheckBox" name="useADCheckbox">
|
||||
+ <property name="text">
|
||||
+ <string>Use Active Directory</string>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
+ <item>
|
||||
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
+ <item>
|
||||
+ <widget class="QLabel" name="domainLabel">
|
||||
+ <property name="text">
|
||||
+ <string>Domain:</string>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <widget class="QLineEdit" name="domainField"/>
|
||||
+ </item>
|
||||
+ </layout>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <layout class="QHBoxLayout" name="horizontalLayout">
|
||||
+ <item>
|
||||
+ <widget class="QLabel" name="domainAdminLabel">
|
||||
+ <property name="text">
|
||||
+ <string>Domain Administrator:</string>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <widget class="QLineEdit" name="domainAdminField"/>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <widget class="QLabel" name="domainPasswordLabel">
|
||||
+ <property name="text">
|
||||
+ <string>Password:</string>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <widget class="QLineEdit" name="domainPasswordField">
|
||||
+ <property name="echoMode">
|
||||
+ <enum>QLineEdit::Password</enum>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ </layout>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
+ <item>
|
||||
+ <widget class="QLabel" name="ipAddressLabel">
|
||||
+ <property name="text">
|
||||
+ <string>IP Address (optional):</string>
|
||||
+ </property>
|
||||
+ </widget>
|
||||
+ </item>
|
||||
+ <item>
|
||||
+ <widget class="QLineEdit" name="ipAddressField"/>
|
||||
+ </item>
|
||||
+ </layout>
|
||||
+ </item>
|
||||
+ </layout>
|
||||
+ </item>
|
||||
+ </layout>
|
||||
+ </item>
|
||||
+ <item>
|
||||
<spacer name="verticalSpacer_7">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
--- a/src/modules/users/users.conf
|
||||
+++ b/src/modules/users/users.conf
|
||||
@@ -265,6 +265,12 @@ hostname:
|
||||
template: "derp-${cpu}"
|
||||
forbidden_names: [ localhost ]
|
||||
|
||||
+# Enable Active Directory enrollment support (opt-in)
|
||||
+#
|
||||
+# This uses realmd to enroll the machine in an Active Directory server
|
||||
+# It requires realmd as a runtime dependency of Calamares, if enabled
|
||||
+allowActiveDirectory: false
|
||||
+
|
||||
presets:
|
||||
fullName:
|
||||
# value: "OEM User"
|
||||
--- a/src/modules/users/users.schema.yaml
|
||||
+++ b/src/modules/users/users.schema.yaml
|
||||
@@ -52,6 +52,7 @@ properties:
|
||||
writeHostsFile: { type: boolean, default: true }
|
||||
template: { type: string, default: "${first}-${product}" }
|
||||
forbidden_names: { type: array, items: { type: string } }
|
||||
+ allowActiveDirectory: { type: boolean, default: false }
|
||||
|
||||
# Presets
|
||||
#
|
||||
--- a/src/modules/users/UsersPage.cpp
|
||||
+++ b/src/modules/users/UsersPage.cpp
|
||||
@@ -162,6 +162,34 @@ UsersPage::UsersPage( Config* config, QW
|
||||
config, &Config::requireStrongPasswordsChanged, ui->checkBoxRequireStrongPassword, &QCheckBox::setChecked );
|
||||
}
|
||||
|
||||
+ // Active Directory is not checked or enabled by default
|
||||
+ ui->useADCheckbox->setVisible(m_config->getActiveDirectoryEnabled());
|
||||
+ ui->domainLabel->setVisible(false);
|
||||
+ ui->domainField->setVisible(false);
|
||||
+ ui->domainAdminLabel->setVisible(false);
|
||||
+ ui->domainAdminField->setVisible(false);
|
||||
+ ui->domainPasswordField->setVisible(false);
|
||||
+ ui->domainPasswordLabel->setVisible(false);
|
||||
+ ui->ipAddressField->setVisible(false);
|
||||
+ ui->ipAddressLabel->setVisible(false);
|
||||
+
|
||||
+ connect(ui->useADCheckbox, &QCheckBox::toggled, [=](bool checked){
|
||||
+ ui->domainLabel->setVisible(checked);
|
||||
+ ui->domainField->setVisible(checked);
|
||||
+ ui->domainAdminLabel->setVisible(checked);
|
||||
+ ui->domainAdminField->setVisible(checked);
|
||||
+ ui->domainPasswordField->setVisible(checked);
|
||||
+ ui->domainPasswordLabel->setVisible(checked);
|
||||
+ ui->ipAddressField->setVisible(checked);
|
||||
+ ui->ipAddressLabel->setVisible(checked);
|
||||
+ });
|
||||
+
|
||||
+ connect( ui->domainField, &QLineEdit::textChanged, config, &Config::setActiveDirectoryDomain );
|
||||
+ connect( ui->domainAdminField, &QLineEdit::textChanged, config, &Config::setActiveDirectoryAdminUsername );
|
||||
+ connect( ui->domainPasswordField, &QLineEdit::textChanged, config, &Config::setActiveDirectoryAdminPassword );
|
||||
+ connect( ui->ipAddressField, &QLineEdit::textChanged, config, &Config::setActiveDirectoryIP );
|
||||
+ connect( ui->useADCheckbox, &QCheckBox::toggled, config, &Config::setActiveDirectoryUsed );
|
||||
+
|
||||
CALAMARES_RETRANSLATE_SLOT( &UsersPage::retranslate );
|
||||
|
||||
onReuseUserPasswordChanged( m_config->reuseUserPasswordForRoot() );
|
||||
--- /dev/null
|
||||
+++ b/src/modules/users/ActiveDirectoryJob.cpp
|
||||
@@ -0,0 +1,91 @@
|
||||
+/* === This file is part of Calamares - <https://calamares.io> ===
|
||||
+ *
|
||||
+ * SPDX-FileCopyrightText: 2024 Simon Quigley <tsimonq2@ubuntu.com>
|
||||
+ * SPDX-License-Identifier: GPL-3.0-or-later
|
||||
+ */
|
||||
+
|
||||
+#include "ActiveDirectoryJob.h"
|
||||
+
|
||||
+#include "Config.h"
|
||||
+
|
||||
+#include "GlobalStorage.h"
|
||||
+#include "JobQueue.h"
|
||||
+#include "utils/Logger.h"
|
||||
+#include "utils/Permissions.h"
|
||||
+#include "utils/System.h"
|
||||
+
|
||||
+#include <QDateTime>
|
||||
+#include <QDir>
|
||||
+#include <QFile>
|
||||
+#include <QFileInfo>
|
||||
+#include <QTextStream>
|
||||
+#include <QProcess>
|
||||
+
|
||||
+ActiveDirectoryJob::ActiveDirectoryJob(QStringList& activeDirectoryInfo)
|
||||
+ : Calamares::Job()
|
||||
+ , m_activeDirectoryInfo(activeDirectoryInfo)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+QString
|
||||
+ActiveDirectoryJob::prettyName() const
|
||||
+{
|
||||
+ return tr( "Enroll system in Active Directory" );
|
||||
+}
|
||||
+
|
||||
+QString
|
||||
+ActiveDirectoryJob::prettyDescription() const
|
||||
+{
|
||||
+ return tr( "Enroll system in Active Directory" );
|
||||
+}
|
||||
+
|
||||
+QString
|
||||
+ActiveDirectoryJob::prettyStatusMessage() const
|
||||
+{
|
||||
+ return tr( "Enrolling system in Active Directory" );
|
||||
+}
|
||||
+
|
||||
+Calamares::JobResult
|
||||
+ActiveDirectoryJob::exec()
|
||||
+{
|
||||
+ QString username = m_activeDirectoryInfo.value(0);
|
||||
+ QString password = m_activeDirectoryInfo.value(1);
|
||||
+ QString domain = m_activeDirectoryInfo.value(2);
|
||||
+ QString ip = m_activeDirectoryInfo.value(3);
|
||||
+
|
||||
+ Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
|
||||
+ QString rootMountPoint = gs ? gs->value("rootMountPoint").toString() : QString();
|
||||
+
|
||||
+ if (!ip.isEmpty()) {
|
||||
+ QString hostsFilePath = !rootMountPoint.isEmpty() ? rootMountPoint + "/etc/hosts" : "/etc/hosts";
|
||||
+ QFile hostsFile(hostsFilePath);
|
||||
+ if (hostsFile.open(QIODevice::Append | QIODevice::Text)) {
|
||||
+ QTextStream out(&hostsFile);
|
||||
+ out << ip << " " << domain << "\n";
|
||||
+ hostsFile.close();
|
||||
+ } else {
|
||||
+ return Calamares::JobResult::error("Failed to open /etc/hosts for writing.");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ QString installPath = !rootMountPoint.isEmpty() ? rootMountPoint : "/";
|
||||
+ QStringList args = {"join", domain, "-U", username, "--install=" + installPath, "--verbose"};
|
||||
+
|
||||
+ QProcess process;
|
||||
+ process.start("realm", args);
|
||||
+ process.waitForStarted();
|
||||
+
|
||||
+ if (!password.isEmpty()) {
|
||||
+ process.write((password + "\n").toUtf8());
|
||||
+ process.closeWriteChannel();
|
||||
+ }
|
||||
+
|
||||
+ process.waitForFinished(-1);
|
||||
+
|
||||
+ if (process.exitCode() == 0) {
|
||||
+ return Calamares::JobResult::ok();
|
||||
+ } else {
|
||||
+ QString errorOutput = process.readAllStandardError();
|
||||
+ return Calamares::JobResult::error(QString("Failed to join realm: %1").arg(errorOutput));
|
||||
+ }
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/src/modules/users/ActiveDirectoryJob.h
|
||||
@@ -0,0 +1,29 @@
|
||||
+/* === This file is part of Calamares - <https://calamares.io> ===
|
||||
+ *
|
||||
+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac <teo@kde.org>
|
||||
+ * SPDX-License-Identifier: GPL-3.0-or-later
|
||||
+ *
|
||||
+ * Calamares is Free Software: see the License-Identifier above.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef ACTIVEDIRECTORYJOB_H
|
||||
+#define ACTIVEDIRECTORYJOB_H
|
||||
+
|
||||
+#include "Job.h"
|
||||
+
|
||||
+class ActiveDirectoryJob : public Calamares::Job
|
||||
+{
|
||||
+ Q_OBJECT
|
||||
+public:
|
||||
+ ActiveDirectoryJob( QStringList& activeDirectoryInfo );
|
||||
+ QString prettyName() const override;
|
||||
+ QString prettyDescription() const override;
|
||||
+ QString prettyStatusMessage() const override;
|
||||
+ Calamares::JobResult exec() override;
|
||||
+
|
||||
+private:
|
||||
+ QStringList m_activeDirectoryInfo;
|
||||
+};
|
||||
+
|
||||
+#endif /* ACTIVEDIRECTORYJOB_H */
|
||||
--- a/src/modules/users/CMakeLists.txt
|
||||
+++ b/src/modules/users/CMakeLists.txt
|
||||
@@ -55,6 +55,7 @@ include_directories(${PROJECT_BINARY_DIR
|
||||
|
||||
set(_users_src
|
||||
# Jobs
|
||||
+ ActiveDirectoryJob.cpp
|
||||
CreateUserJob.cpp
|
||||
MiscJobs.cpp
|
||||
SetPasswordJob.cpp
|
@ -1,120 +0,0 @@
|
||||
Description: Allow specifying partitions that are only present when FDE is used.
|
||||
Author: Aaron Rainbolt <arraybolt3@ubuntu.com>
|
||||
Origin: ubuntu
|
||||
Forwarded: not-needed
|
||||
Last-Update: 2024-02-26
|
||||
|
||||
--- a/src/modules/partition/core/PartitionLayout.cpp
|
||||
+++ b/src/modules/partition/core/PartitionLayout.cpp
|
||||
@@ -62,6 +62,7 @@ PartitionLayout::PartitionEntry::Partiti
|
||||
const QString& mountPoint,
|
||||
const QString& fs,
|
||||
const bool& noEncrypt,
|
||||
+ const bool& onlyPresentWithEncryption,
|
||||
const QVariantMap& features,
|
||||
const QString& size,
|
||||
const QString& minSize,
|
||||
@@ -72,6 +73,7 @@ PartitionLayout::PartitionEntry::Partiti
|
||||
, partAttributes( attributes )
|
||||
, partMountPoint( mountPoint )
|
||||
, partNoEncrypt( noEncrypt )
|
||||
+ , partOnlyPresentWithEncryption ( onlyPresentWithEncryption )
|
||||
, partFeatures( features )
|
||||
, partSize( size )
|
||||
, partMinSize( minSize )
|
||||
@@ -119,6 +121,7 @@ PartitionLayout::init( FileSystem::Type
|
||||
Calamares::getString( pentry, "mountPoint" ),
|
||||
Calamares::getString( pentry, "filesystem", "unformatted" ),
|
||||
Calamares::getBool( pentry, "noEncrypt", false ),
|
||||
+ Calamares::getBool( pentry, "onlyPresentWithEncryption", false ),
|
||||
Calamares::getSubMap( pentry, "features", ok ),
|
||||
Calamares::getString( pentry, "size", QStringLiteral( "0" ) ),
|
||||
Calamares::getString( pentry, "minSize", QStringLiteral( "0" ) ),
|
||||
@@ -228,6 +231,10 @@ PartitionLayout::createPartitions( Devic
|
||||
cWarning() << "Partition" << entry.partMountPoint << "size is invalid, skipping...";
|
||||
continue;
|
||||
}
|
||||
+ if ( luksPassphrase.isEmpty() && entry.partOnlyPresentWithEncryption ) {
|
||||
+ // this partition is being skipped entirely
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
// Calculate partition size: Rely on "possibly uninitialized use"
|
||||
// warnings to ensure that all the cases are covered below.
|
||||
@@ -252,6 +259,10 @@ PartitionLayout::createPartitions( Devic
|
||||
availableSectors = totalSectors;
|
||||
for ( const auto& entry : qAsConst( m_partLayout ) )
|
||||
{
|
||||
+ if ( luksPassphrase.isEmpty() && entry.partOnlyPresentWithEncryption ) {
|
||||
+ // this partition is being skipped entirely
|
||||
+ continue;
|
||||
+ }
|
||||
qint64 sectors = partSectorsMap.value( &entry );
|
||||
if ( entry.partMinSize.isValid() )
|
||||
{
|
||||
@@ -265,6 +276,10 @@ PartitionLayout::createPartitions( Devic
|
||||
// Assign sectors for percentage-defined partitions.
|
||||
for ( const auto& entry : qAsConst( m_partLayout ) )
|
||||
{
|
||||
+ if ( luksPassphrase.isEmpty() && entry.partOnlyPresentWithEncryption ) {
|
||||
+ // this partition is being skipped entirely
|
||||
+ continue;
|
||||
+ }
|
||||
if ( entry.partSize.unit() == Calamares::Partition::SizeUnit::Percent )
|
||||
{
|
||||
qint64 sectors
|
||||
@@ -288,6 +303,10 @@ PartitionLayout::createPartitions( Devic
|
||||
availableSectors = totalSectors;
|
||||
for ( const auto& entry : qAsConst( m_partLayout ) )
|
||||
{
|
||||
+ if ( luksPassphrase.isEmpty() && entry.partOnlyPresentWithEncryption ) {
|
||||
+ // this partition is being skipped entirely
|
||||
+ continue;
|
||||
+ }
|
||||
// Adjust partition size based on available space.
|
||||
qint64 sectors = partSectorsMap.value( &entry );
|
||||
sectors = std::min( sectors, availableSectors );
|
||||
--- a/src/modules/partition/core/PartitionLayout.h
|
||||
+++ b/src/modules/partition/core/PartitionLayout.h
|
||||
@@ -38,6 +38,7 @@ public:
|
||||
QString partMountPoint;
|
||||
FileSystem::Type partFileSystem = FileSystem::Unknown;
|
||||
bool partNoEncrypt = false;
|
||||
+ bool partOnlyPresentWithEncryption;
|
||||
QVariantMap partFeatures;
|
||||
Calamares::Partition::PartitionSize partSize;
|
||||
Calamares::Partition::PartitionSize partMinSize;
|
||||
@@ -63,6 +64,7 @@ public:
|
||||
const QString& mountPoint,
|
||||
const QString& fs,
|
||||
const bool& noEncrypt,
|
||||
+ const bool& onlyPresentWithEncryption,
|
||||
const QVariantMap& features,
|
||||
const QString& size,
|
||||
const QString& minSize = QString(),
|
||||
--- a/src/modules/partition/partition.conf
|
||||
+++ b/src/modules/partition/partition.conf
|
||||
@@ -259,6 +259,7 @@ defaultFileSystemType: "ext4"
|
||||
# type: "4f68bce3-e8cd-4db1-96e7-fbcaf984b709"
|
||||
# filesystem: "ext4"
|
||||
# noEncrypt: false
|
||||
+# onlyPresentWithEncryption: false
|
||||
# mountPoint: "/"
|
||||
# size: 20%
|
||||
# minSize: 500M
|
||||
@@ -268,6 +269,7 @@ defaultFileSystemType: "ext4"
|
||||
# type: "933ac7e1-2eb4-4f13-b844-0e14e2aef915"
|
||||
# filesystem: "ext4"
|
||||
# noEncrypt: false
|
||||
+# onlyPresentWithEncryption: false
|
||||
# mountPoint: "/home"
|
||||
# size: 3G
|
||||
# minSize: 1.5G
|
||||
@@ -296,6 +298,7 @@ defaultFileSystemType: "ext4"
|
||||
# default filesystem type, or the user's choice, will be applied instead
|
||||
# of "unknown" (e.g. the user might pick ext4, or xfs).
|
||||
# - noEncrypt: whether this partition is exempt from encryption if enabled (optional parameter; default is false)
|
||||
+# - onlyPresentWithEncryption: whether this partition is only created when encryption is enabled (optional parameter; default is false; ONLY SUPPORTED IN UBUNTU)
|
||||
# - mountPoint: partition mount point (optional parameter; not mounted if unset)
|
||||
# - size: partition size in bytes (append 'K', 'M' or 'G' for KiB, MiB or GiB)
|
||||
# or
|
@ -1,82 +0,0 @@
|
||||
Description: Populate grub-{efi,pc}/install_devices debconf config
|
||||
Author: Simon Quigley <tsimonq2@ubuntu.com>
|
||||
Origin: vendor
|
||||
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/calamares/+bug/2063354
|
||||
Last-Update: 2024-04-24
|
||||
---
|
||||
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
|
||||
--- a/src/modules/bootloader/main.py
|
||||
+++ b/src/modules/bootloader/main.py
|
||||
@@ -25,6 +25,7 @@ import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
+import tempfile
|
||||
|
||||
import libcalamares
|
||||
|
||||
@@ -581,6 +582,46 @@ def get_grub_efi_parameters():
|
||||
return None
|
||||
|
||||
|
||||
+def get_disk_id(device_name, efi):
|
||||
+ by_id_path = "/dev/disk/by-id"
|
||||
+
|
||||
+ if efi:
|
||||
+ partitions = libcalamares.globalstorage.value("partitions")
|
||||
+ device_name = None
|
||||
+
|
||||
+ for partition in partitions:
|
||||
+ if "/boot/efi" in partition["mountPoint"]:
|
||||
+ device_name = partition["device"]
|
||||
+ break
|
||||
+
|
||||
+ device_path = os.path.realpath(device_name)
|
||||
+
|
||||
+ for entry in os.listdir(by_id_path):
|
||||
+ full_entry_path = os.path.join(by_id_path, entry)
|
||||
+ if os.path.realpath(full_entry_path) == device_path:
|
||||
+ return full_entry_path
|
||||
+
|
||||
+ return None
|
||||
+
|
||||
+
|
||||
+def set_grub_debconf_config(device_name, efi=False):
|
||||
+ dev_id_path = get_disk_id(device_name, efi=efi)
|
||||
+
|
||||
+ if not dev_id_path:
|
||||
+ return None
|
||||
+
|
||||
+ temp_dir = libcalamares.globalstorage.value("rootMountPoint") + "/tmp/"
|
||||
+ with tempfile.NamedTemporaryFile(mode="w", delete=False, dir=temp_dir) as tmpfile:
|
||||
+ debconf_target = "grub-efi" if efi else "grub-pc"
|
||||
+
|
||||
+ tmpfile.write(f"grub-pc {debconf_target}/install_devices multiselect {dev_id_path}\n")
|
||||
+ tmpfile_path = tmpfile.name
|
||||
+
|
||||
+ debconf_config = "/tmp/" + os.path.basename(tmpfile_path)
|
||||
+ check_target_env_call(["/usr/bin/debconf-set-selections", debconf_config])
|
||||
+ os.remove(tmpfile_path)
|
||||
+
|
||||
+
|
||||
def run_grub_mkconfig(partitions, output_file):
|
||||
"""
|
||||
Runs grub-mkconfig in the target environment
|
||||
@@ -631,6 +672,8 @@ def run_grub_install(fw_type, partitions
|
||||
"--efi-directory=" + efi_directory,
|
||||
"--bootloader-id=" + efi_bootloader_id,
|
||||
"--force"])
|
||||
+
|
||||
+ set_grub_debconf_config(efi_target, efi=True)
|
||||
else:
|
||||
assert efi_directory is None
|
||||
if libcalamares.globalstorage.value("bootLoader") is None:
|
||||
@@ -652,6 +695,8 @@ def run_grub_install(fw_type, partitions
|
||||
"--force",
|
||||
boot_loader["installPath"]])
|
||||
|
||||
+ set_grub_debconf_config(boot_loader["installPath"])
|
||||
+
|
||||
|
||||
def install_grub(efi_directory, fw_type):
|
||||
"""
|
@ -1,6 +0,0 @@
|
||||
Name: calamares
|
||||
Bug-Database: https://github.com/calamares/calamares/issues
|
||||
Bug-Submit: https://github.com/calamares/calamares/issues/new?assignees=&labels=&projects=&template=bug_report.md
|
||||
Changelog: https://github.com/calamares/calamares/blob/calamares/CHANGES-3.3
|
||||
Repository: https://github.com/calamares/calamares.git
|
||||
Repository-Browse: https://github.com/calamares/calamares
|
@ -1,5 +1,3 @@
|
||||
version=4
|
||||
opts="searchmode=plain, \
|
||||
pgpsigurlmangle=s/$/.asc/, \
|
||||
uversionmangle=s/(\d+\.\d+\.\d+).*/$1/" \
|
||||
https://api.github.com/repos/calamares/@PACKAGE@/releases https:\/\/github.com\/calamares\/calamares\/releases\/download\/v(?:[-_]?(\d[\-+\.:\~\da-zA-Z]*))\/calamares-(?:[-_]?(\d[\-+\.:\~\da-zA-Z]*)).tar.gz
|
||||
opts="pgpsigurlmangle=s/$/.asc/, uversionmangle=s/\..$/-alpha2/" \
|
||||
https://github.com/calamares/calamares/releases .*/calamares-([\d\.]+)-alpha([\d]+).tar.gz
|
||||
|
Loading…
Reference in new issue