Compare commits
No commits in common. "ubuntu/1%25.10.2" and "ubuntu/plucky" have entirely different histories.
ubuntu/1%2
...
ubuntu/plu
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: true
|
|
||||||
timeout: 10
|
|
||||||
firmwareType:
|
|
||||||
efi:
|
|
||||||
- -cp /cdrom/casper/vmlinuz ${ROOT}/boot/vmlinuz-$(uname -r)
|
|
||||||
- -mkdir -pv ${ROOT}/media/cdrom
|
|
||||||
- -mount --bind /cdrom ${ROOT}/media/cdrom
|
|
||||||
bios:
|
|
||||||
- -cp /cdrom/casper/vmlinuz ${ROOT}/boot/vmlinuz-$(uname -r)
|
|
5
common/modules/copy_vmlinuz_shellprocess.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
dontChroot: true
|
||||||
|
timeout: 60
|
||||||
|
script:
|
||||||
|
- command: "cp /cdrom/casper/vmlinuz ${ROOT}/boot/vmlinuz-$(uname -r)"
|
@ -1,35 +1,55 @@
|
|||||||
#include "PackageSelectViewStep.h"
|
#include "PackageSelectViewStep.h"
|
||||||
|
#include "ui_pkgselect.h"
|
||||||
#include "JobQueue.h"
|
#include "JobQueue.h"
|
||||||
#include "GlobalStorage.h"
|
#include "GlobalStorage.h"
|
||||||
#include "Branding.h"
|
|
||||||
#include "network/Manager.h"
|
#include "network/Manager.h"
|
||||||
|
|
||||||
#include <QVariantMap>
|
#include <QCheckBox>
|
||||||
|
#include <QVariant>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QRadioButton>
|
||||||
|
|
||||||
PackageSelectViewStep::PackageSelectViewStep( QObject* parent )
|
/**
|
||||||
: Calamares::ViewStep( parent ),
|
* @brief Initializes a new PackageSelectViewStep object.
|
||||||
m_packageSelections(QVariantMap()),
|
* @param parent The parent QObject.
|
||||||
ui(new Ui::pkgselect)
|
*/
|
||||||
|
PackageSelectViewStep::PackageSelectViewStep(QObject* parent)
|
||||||
|
: Calamares::ViewStep(parent),
|
||||||
|
m_packageSelections(),
|
||||||
|
ui(new Ui::pkgselect),
|
||||||
|
m_widget(new QWidget()), // Parent set to nullptr
|
||||||
|
m_connectionsMade(false)
|
||||||
{
|
{
|
||||||
m_widget = new QWidget();
|
|
||||||
ui->setupUi(m_widget);
|
ui->setupUi(m_widget);
|
||||||
|
|
||||||
|
// Layout Adjustment to Prevent Shifting
|
||||||
|
// Ensures that hiding/showing elements does not disrupt the layout
|
||||||
|
QGridLayout* mainLayout = qobject_cast<QGridLayout*>(ui->gridLayout);
|
||||||
|
if (mainLayout) {
|
||||||
|
mainLayout->setRowStretch(mainLayout->rowCount(), 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cleans up the PackageSelectViewStep object.
|
||||||
|
*/
|
||||||
PackageSelectViewStep::~PackageSelectViewStep()
|
PackageSelectViewStep::~PackageSelectViewStep()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
delete m_widget;
|
delete m_widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString PackageSelectViewStep::prettyName() const
|
||||||
PackageSelectViewStep::prettyName() const
|
|
||||||
{
|
{
|
||||||
return tr( "Customize" );
|
return tr("Customize");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PackageSelectViewStep::exists_and_true(const QString& key) const
|
bool PackageSelectViewStep::exists_and_true(const QString& key) const
|
||||||
{
|
{
|
||||||
return m_packageSelections.contains(key) && m_packageSelections[key].toBool() == true;
|
return m_packageSelections.contains(key) && m_packageSelections.value(key).toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget* PackageSelectViewStep::widget()
|
QWidget* PackageSelectViewStep::widget()
|
||||||
@ -62,71 +82,26 @@ bool PackageSelectViewStep::isAtEnd() const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PackageSelectViewStep::setConfigurationMap(const QVariantMap& configurationMap)
|
||||||
|
{
|
||||||
|
m_configurationMap = configurationMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Activates the step, setting up the UI based on network availability and configuration.
|
||||||
|
*
|
||||||
|
* This method is called when the step becomes active. It handles network checks,
|
||||||
|
* dynamically creates package selection checkboxes, and connects signal handlers.
|
||||||
|
*/
|
||||||
void PackageSelectViewStep::onActivate()
|
void PackageSelectViewStep::onActivate()
|
||||||
{
|
{
|
||||||
// Connect the Minimal Installation radio button
|
// Check network availability
|
||||||
connect(ui->minimal_button, &QRadioButton::toggled, this, [this](bool checked) {
|
|
||||||
Calamares::Network::Manager network;
|
Calamares::Network::Manager network;
|
||||||
if (checked && network.hasInternet()) {
|
bool hasInternet = network.hasInternet();
|
||||||
ui->extraparty_scroll->setVisible(false);
|
|
||||||
ui->extraparty_text->setVisible(false);
|
|
||||||
ui->mandatory_warning_label->setVisible(false);
|
|
||||||
|
|
||||||
ui->element_button->setChecked(false);
|
// Handle network unavailability
|
||||||
ui->thunderbird_button->setChecked(false);
|
//if (!hasInternet) {
|
||||||
ui->virtmanager_button->setChecked(false);
|
// Disable almost all fancy features to avoid bugs, revert in 25.10 cycle
|
||||||
ui->krita_button->setChecked(false);
|
|
||||||
|
|
||||||
ui->element_button->setEnabled(false);
|
|
||||||
ui->thunderbird_button->setEnabled(false);
|
|
||||||
ui->virtmanager_button->setEnabled(false);
|
|
||||||
ui->krita_button->setEnabled(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Connect the Normal Installation radio button
|
|
||||||
connect(ui->normal_button, &QRadioButton::toggled, this, [this](bool checked) {
|
|
||||||
Calamares::Network::Manager network;
|
|
||||||
if (checked && network.hasInternet()) {
|
|
||||||
ui->extraparty_scroll->setVisible(true);
|
|
||||||
ui->extraparty_text->setVisible(true);
|
|
||||||
ui->mandatory_warning_label->setVisible(true);
|
|
||||||
|
|
||||||
ui->element_button->setChecked(false);
|
|
||||||
ui->thunderbird_button->setChecked(false);
|
|
||||||
ui->virtmanager_button->setChecked(false);
|
|
||||||
ui->krita_button->setChecked(false);
|
|
||||||
|
|
||||||
ui->element_button->setEnabled(true);
|
|
||||||
ui->thunderbird_button->setEnabled(true);
|
|
||||||
ui->virtmanager_button->setEnabled(true);
|
|
||||||
ui->krita_button->setEnabled(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Connect the Full Installation radio button
|
|
||||||
connect(ui->full_button, &QRadioButton::toggled, this, [this](bool checked) {
|
|
||||||
Calamares::Network::Manager network;
|
|
||||||
if (checked && network.hasInternet()) {
|
|
||||||
ui->extraparty_scroll->setVisible(true);
|
|
||||||
ui->extraparty_text->setVisible(true);
|
|
||||||
ui->mandatory_warning_label->setVisible(true);
|
|
||||||
|
|
||||||
ui->element_button->setChecked(true);
|
|
||||||
ui->thunderbird_button->setChecked(true);
|
|
||||||
ui->virtmanager_button->setChecked(true);
|
|
||||||
ui->krita_button->setChecked(true);
|
|
||||||
|
|
||||||
ui->element_button->setEnabled(false);
|
|
||||||
ui->thunderbird_button->setEnabled(false);
|
|
||||||
ui->virtmanager_button->setEnabled(false);
|
|
||||||
ui->krita_button->setEnabled(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Disable many bits of functionality if network is not enabled
|
|
||||||
Calamares::Network::Manager network;
|
|
||||||
if (!network.hasInternet()) {
|
|
||||||
ui->full_button->setVisible(false);
|
ui->full_button->setVisible(false);
|
||||||
ui->full_text->setVisible(false);
|
ui->full_text->setVisible(false);
|
||||||
|
|
||||||
@ -140,69 +115,277 @@ void PackageSelectViewStep::onActivate()
|
|||||||
ui->extraparty_scroll->setVisible(false);
|
ui->extraparty_scroll->setVisible(false);
|
||||||
ui->extraparty_text->setVisible(false);
|
ui->extraparty_text->setVisible(false);
|
||||||
ui->mandatory_warning_label->setVisible(false);
|
ui->mandatory_warning_label->setVisible(false);
|
||||||
|
//}
|
||||||
|
|
||||||
ui->element_button->setChecked(false);
|
// Dynamically create package checkboxes only once
|
||||||
ui->thunderbird_button->setChecked(false);
|
if (m_packageCheckBoxes.isEmpty()) {
|
||||||
ui->virtmanager_button->setChecked(false);
|
QVariantList additionalPackages = m_configurationMap.value("packages").toMap().value("additional_packages").toList();
|
||||||
ui->krita_button->setChecked(false);
|
QVBoxLayout* packagesLayout = ui->extraparty_scrollhouse->findChild<QVBoxLayout*>("packages_layout");
|
||||||
|
if (!packagesLayout) {
|
||||||
ui->element_button->setEnabled(false);
|
qWarning() << "packages_layout not found in UI.";
|
||||||
ui->thunderbird_button->setEnabled(false);
|
return;
|
||||||
ui->virtmanager_button->setEnabled(false);
|
|
||||||
ui->krita_button->setEnabled(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Thunderbird exists on Kubuntu already
|
for (const QVariant& var : additionalPackages) {
|
||||||
if (Calamares::Branding::instance()->componentName() == "kubuntu") {
|
QVariantMap pkg = var.toMap();
|
||||||
ui->thunderbird_button->setChecked(false);
|
QString packageId = pkg.value("id").toString();
|
||||||
ui->thunderbird_button->setEnabled(false);
|
QString packageName = pkg.value("name").toString();
|
||||||
ui->thunderbird_button->setVisible(false);
|
QString packageDescription = pkg.value("description").toString();
|
||||||
ui->thunderbird_text->setVisible(false);
|
bool isSnap = pkg.value("snap").toBool();
|
||||||
ui->thunderbird_spacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
|
|
||||||
ui->thunderbird_spacer->invalidate();
|
// Create checkbox
|
||||||
|
QCheckBox* checkbox = new QCheckBox(packageName, m_widget);
|
||||||
|
checkbox->setObjectName(packageId); // Naming as packageId directly
|
||||||
|
|
||||||
|
// Create description label
|
||||||
|
QLabel* descriptionLabel = new QLabel(packageDescription, m_widget);
|
||||||
|
QFont descFont = descriptionLabel->font();
|
||||||
|
descFont.setPointSize(10);
|
||||||
|
descFont.setItalic(true);
|
||||||
|
descriptionLabel->setFont(descFont);
|
||||||
|
descriptionLabel->setWordWrap(true);
|
||||||
|
|
||||||
|
// Add to layout
|
||||||
|
packagesLayout->addWidget(checkbox);
|
||||||
|
packagesLayout->addWidget(descriptionLabel);
|
||||||
|
|
||||||
|
// Store in the map
|
||||||
|
m_packageCheckBoxes.insert(packageId, checkbox);
|
||||||
|
|
||||||
|
// Connect checkbox toggled signal
|
||||||
|
connect(checkbox, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect the storage items
|
// Handle installation modes
|
||||||
/// Full/Normal/Minimal
|
// Connect radio buttons to lambda functions only once
|
||||||
connect(ui->minimal_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
if (!m_connectionsMade) {
|
||||||
connect(ui->normal_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
connect(ui->minimal_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) {
|
||||||
connect(ui->full_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
if (checked && hasInternet) {
|
||||||
/// Additional Options
|
// Hide additional packages UI
|
||||||
connect(ui->updates_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
ui->extraparty_scroll->setVisible(false);
|
||||||
/// Third-Party Apps
|
ui->extraparty_text->setVisible(false);
|
||||||
connect(ui->element_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
ui->mandatory_warning_label->setVisible(false);
|
||||||
connect(ui->thunderbird_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
|
||||||
connect(ui->virtmanager_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
// Uncheck and disable all additional package checkboxes
|
||||||
connect(ui->krita_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
|
QVariantList removePackages = m_configurationMap.value("packages").toMap().value("minimal_remove_packages").toList();
|
||||||
|
for (const QVariant& var : removePackages) {
|
||||||
|
QString packageId = var.toString();
|
||||||
|
QCheckBox* checkbox = m_packageCheckBoxes.value(packageId, nullptr);
|
||||||
|
if (checkbox) {
|
||||||
|
checkbox->setChecked(false);
|
||||||
|
checkbox->setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(ui->normal_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) {
|
||||||
|
if (checked && hasInternet) {
|
||||||
|
// Show additional packages UI
|
||||||
|
ui->extraparty_scroll->setVisible(true);
|
||||||
|
ui->extraparty_text->setVisible(true);
|
||||||
|
ui->mandatory_warning_label->setVisible(true);
|
||||||
|
|
||||||
|
// Enable all additional package checkboxes
|
||||||
|
for (auto checkbox : m_packageCheckBoxes) {
|
||||||
|
if (checkbox) {
|
||||||
|
checkbox->setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(ui->full_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) {
|
||||||
|
if (checked && hasInternet) {
|
||||||
|
// Show additional packages UI
|
||||||
|
ui->extraparty_scroll->setVisible(true);
|
||||||
|
ui->extraparty_text->setVisible(true);
|
||||||
|
ui->mandatory_warning_label->setVisible(true);
|
||||||
|
|
||||||
|
// Check and disable all additional package checkboxes
|
||||||
|
for (auto checkbox : m_packageCheckBoxes) {
|
||||||
|
if (checkbox) {
|
||||||
|
checkbox->setChecked(true);
|
||||||
|
checkbox->setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
m_connectionsMade = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Layout Adjustment to Prevent Shifting
|
||||||
|
// Ensure that hiding/showing elements does not center the remaining widgets
|
||||||
|
// This is generally handled by Qt's layout system, but adding stretch ensures stability
|
||||||
|
QGridLayout* mainLayout = qobject_cast<QGridLayout*>(ui->gridLayout);
|
||||||
|
if (mainLayout) {
|
||||||
|
mainLayout->setRowStretch(mainLayout->rowCount(), 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/**
|
||||||
PackageSelectViewStep::onLeave()
|
* @brief Handles actions to perform when leaving the step, such as storing selected packages.
|
||||||
|
*
|
||||||
|
* This method gathers the selected packages, determines the installation mode,
|
||||||
|
* and stores the relevant data into Calamares' GlobalStorage for use in subsequent steps.
|
||||||
|
*/
|
||||||
|
void PackageSelectViewStep::onLeave()
|
||||||
{
|
{
|
||||||
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
|
Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage();
|
||||||
QVariantMap config;
|
if (!gs) {
|
||||||
for (auto i = m_packageSelections.begin(); i != m_packageSelections.end(); ++i) {
|
qWarning() << "GlobalStorage is not available.";
|
||||||
if (exists_and_true(i.key())) {
|
return;
|
||||||
config.insert(i.key(), i.value());
|
}
|
||||||
|
|
||||||
|
bool isStackedSquashfs = m_configurationMap.value("stacked_squashfs").toBool();
|
||||||
|
QVariantMap installationData = gs->value("installation_data").toMap();
|
||||||
|
QString installationMode = installationData.value("installation_mode").toString();
|
||||||
|
bool downloadUpdates = installationData.value("download_updates").toBool();
|
||||||
|
QVariantList packagesToInstall = installationData.value("packages_to_install").toList();
|
||||||
|
QVariantList packagesToRemove = installationData.value("packages_to_remove").toList();
|
||||||
|
QVariantList presentSnaps = installationData.value("present_snaps").toList();
|
||||||
|
|
||||||
|
// Handle default value for rootMountPoint
|
||||||
|
QString rootMountPoint = "/";
|
||||||
|
if (gs->contains("rootMountPoint")) {
|
||||||
|
rootMountPoint = gs->value("rootMountPoint").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap globalData;
|
||||||
|
|
||||||
|
// Determine selected installation mode
|
||||||
|
if (ui->minimal_button->isChecked()) {
|
||||||
|
installationMode = "minimal";
|
||||||
|
} else if (ui->normal_button->isChecked()) {
|
||||||
|
installationMode = "normal";
|
||||||
|
} else if (ui->full_button->isChecked()) {
|
||||||
|
installationMode = "full";
|
||||||
|
}
|
||||||
|
|
||||||
|
globalData.insert("installation_mode", installationMode);
|
||||||
|
|
||||||
|
// Used by unpackfs on stacked squashfs systems
|
||||||
|
if (installationMode == "minimal") {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (installationMode == "minimal") {
|
||||||
|
globalData.insert("unpack_regular", false);
|
||||||
|
if (!isStackedSquashfs) {
|
||||||
|
QVariantList minimalPackages = m_configurationMap.value("packages").toMap().value("minimal_remove_packages").toList();
|
||||||
|
QVariantList installerPackages = m_configurationMap.value("packages").toMap().value("installer_remove_packages").toList();
|
||||||
|
QVariantList combinedRemove = minimalPackages + installerPackages;
|
||||||
|
globalData.insert("packages_to_remove", combinedRemove);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
globalData.insert("unpack_regular", true);
|
||||||
|
// For normal and full, store packages to install
|
||||||
|
QVariantList selectedPackagesList;
|
||||||
|
// Store the snaps that are already on the system by default
|
||||||
|
QStringList presentSnapList;
|
||||||
|
|
||||||
|
// Process all checked boxes
|
||||||
|
for (auto it = m_packageCheckBoxes.constBegin(); it != m_packageCheckBoxes.constEnd(); ++it) {
|
||||||
|
const QString& packageId = it.key();
|
||||||
|
QCheckBox* checkbox = it.value();
|
||||||
|
if (checkbox && checkbox->isChecked()) {
|
||||||
|
// Retrieve package details from configuration
|
||||||
|
QVariantList additionalPackages = m_configurationMap.value("packages").toMap().value("additional_packages").toList();
|
||||||
|
QVariantMap packageDetails;
|
||||||
|
for (const QVariant& var : additionalPackages) {
|
||||||
|
QVariantMap pkg = var.toMap();
|
||||||
|
if (pkg.value("id").toString() == packageId) {
|
||||||
|
packageDetails.insert("id", pkg.value("id").toString());
|
||||||
|
packageDetails.insert("snap", pkg.value("snap").toBool());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gs->insert("packages", config);
|
if (!packageDetails.isEmpty()) {
|
||||||
|
selectedPackagesList.append(packageDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the additional packages to be installed and substitute locale
|
||||||
|
QVariantList installPackages = m_configurationMap.value("packages").toMap().value("regular_install_packages").toList();
|
||||||
|
QString localeVal = gs->value("locale").toString();
|
||||||
|
for (const QVariant& installPackage : installPackages) {
|
||||||
|
QString packageId = installPackage.toString().replace("$LOCALE", localeVal);
|
||||||
|
QVariantMap packageDetails;
|
||||||
|
packageDetails.insert("id", packageId);
|
||||||
|
packageDetails.insert("snap", false);
|
||||||
|
selectedPackagesList.append(packageDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure delta updates are processed first
|
||||||
|
QVariantList refreshSnaps = m_configurationMap.value("packages").toMap().value("refresh_snaps").toList();
|
||||||
|
for (const QVariant& snapVar : refreshSnaps) {
|
||||||
|
QString snapId = snapVar.toString();
|
||||||
|
presentSnapList.append(snapId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// As a temporary measure until OEM is refactored in the 25.10 cycle,
|
||||||
|
// we need to ensure that Calamares and its necessary dependencies are
|
||||||
|
// installed on the target, iff this is a stacked squashfs.
|
||||||
|
// FIXME: remove in favor of more nuanced stacked squashfs
|
||||||
|
// functionality in 25.10
|
||||||
|
// Ref: https://discourse.ubuntu.com/t/implementation-of-ship-live-within-a-squashfs/57510
|
||||||
|
// LP: #2104343
|
||||||
|
if (isStackedSquashfs) {
|
||||||
|
QVector<QString> stage_two_packages = {"calamares", "kdialog"};
|
||||||
|
for (QString& package_name : stage_two_packages) {
|
||||||
|
QVariantMap package_details;
|
||||||
|
package_details.insert("id", package_name);
|
||||||
|
package_details.insert("snap", false);
|
||||||
|
selectedPackagesList.append(package_details);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
globalData.insert("packages_to_install", selectedPackagesList);
|
||||||
|
if (!isStackedSquashfs) {
|
||||||
|
QVariantList installerPackages = m_configurationMap.value("packages").toMap().value("installer_remove_packages").toList();
|
||||||
|
globalData.insert("packages_to_remove", installerPackages);
|
||||||
|
}
|
||||||
|
globalData.insert("present_snaps", presentSnapList);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the state of 'download_updates' checkbox
|
||||||
|
bool updatesChecked = ui->updates_button->isChecked();
|
||||||
|
globalData.insert("download_updates", updatesChecked);
|
||||||
|
|
||||||
|
gs->insert("installation_data", globalData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PackageSelectViewStep::updatePackageSelections(bool checked) {
|
/**
|
||||||
QObject* sender_obj = sender();
|
* @brief Slot to handle checkbox toggle events.
|
||||||
if (!sender_obj) return;
|
*
|
||||||
|
* This method updates the internal package selection map based on user interactions
|
||||||
|
* with the package checkboxes.
|
||||||
|
*
|
||||||
|
* @param checked The new checked state of the checkbox.
|
||||||
|
*/
|
||||||
|
void PackageSelectViewStep::updatePackageSelections(bool checked)
|
||||||
|
{
|
||||||
|
QCheckBox* checkbox = qobject_cast<QCheckBox*>(sender());
|
||||||
|
if (!checkbox)
|
||||||
|
return;
|
||||||
|
|
||||||
QString key = sender_obj->objectName();
|
QString packageId = checkbox->objectName();
|
||||||
|
m_packageSelections[packageId] = checked;
|
||||||
|
|
||||||
// snake_case -> camelCase
|
emit packageSelectionsChanged();
|
||||||
QStringList parts = key.split("_", Qt::SkipEmptyParts);
|
|
||||||
for (int i = 1; i < parts.size(); ++i) {
|
|
||||||
parts[i][0] = parts[i][0].toUpper();
|
|
||||||
}
|
|
||||||
QString camelCaseKey = parts.join("");
|
|
||||||
|
|
||||||
m_packageSelections[camelCaseKey] = checked;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CALAMARES_PLUGIN_FACTORY_DEFINITION( PackageSelectViewStepFactory, registerPlugin< PackageSelectViewStep >(); )
|
/**
|
||||||
|
* @brief Retrieves the checkbox associated with a given package ID.
|
||||||
|
*
|
||||||
|
* @param id The package ID.
|
||||||
|
* @return A pointer to the QCheckBox, or nullptr if not found.
|
||||||
|
*/
|
||||||
|
QCheckBox* PackageSelectViewStep::getCheckboxById(const QString& id) const
|
||||||
|
{
|
||||||
|
return m_packageCheckBoxes.value(id, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
CALAMARES_PLUGIN_FACTORY_DEFINITION(PackageSelectViewStepFactory, registerPlugin<PackageSelectViewStep>(); )
|
||||||
|
@ -1,52 +1,143 @@
|
|||||||
#ifndef PACKAGESELECTVIEWSTEP_H
|
#ifndef PACKAGESELECTVIEWSTEP_H
|
||||||
#define PACKAGESELECTVIEWSTEP_H
|
#define PACKAGESELECTVIEWSTEP_H
|
||||||
|
|
||||||
#include <QFile>
|
#include <QObject>
|
||||||
#include <QTextStream>
|
#include <QVariantMap>
|
||||||
|
#include <QMap>
|
||||||
#include "DllMacro.h"
|
#include "DllMacro.h"
|
||||||
#include "utils/PluginFactory.h"
|
#include "utils/PluginFactory.h"
|
||||||
#include "viewpages/ViewStep.h"
|
#include "viewpages/ViewStep.h"
|
||||||
|
|
||||||
#include "ui_pkgselect.h"
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class pkgselect;
|
class pkgselect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class QCheckBox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class PackageSelectViewStep
|
||||||
|
* @brief A Calamares view step for selecting and customizing packages during installation.
|
||||||
|
*
|
||||||
|
* This class provides a user interface for selecting additional packages to install,
|
||||||
|
* managing installation modes, and handling network availability scenarios.
|
||||||
|
*/
|
||||||
class PLUGINDLLEXPORT PackageSelectViewStep : public Calamares::ViewStep
|
class PLUGINDLLEXPORT PackageSelectViewStep : public Calamares::ViewStep
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PackageSelectViewStep( QObject* parent = nullptr );
|
/**
|
||||||
|
* @brief Constructs a new PackageSelectViewStep object.
|
||||||
|
* @param parent The parent QObject.
|
||||||
|
*/
|
||||||
|
explicit PackageSelectViewStep(QObject* parent = nullptr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroys the PackageSelectViewStep object.
|
||||||
|
*/
|
||||||
~PackageSelectViewStep() override;
|
~PackageSelectViewStep() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the display name of the step.
|
||||||
|
* @return The pretty name as a QString.
|
||||||
|
*/
|
||||||
QString prettyName() const override;
|
QString prettyName() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the widget associated with this step.
|
||||||
|
* @return A pointer to the QWidget.
|
||||||
|
*/
|
||||||
QWidget* widget() override;
|
QWidget* widget() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the list of jobs to execute for this step.
|
||||||
|
* @return An empty Calamares::JobList.
|
||||||
|
*/
|
||||||
Calamares::JobList jobs() const override;
|
Calamares::JobList jobs() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Indicates whether the "Next" button is enabled.
|
||||||
|
* @return Always returns true.
|
||||||
|
*/
|
||||||
bool isNextEnabled() const override;
|
bool isNextEnabled() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Indicates whether the "Back" button is enabled.
|
||||||
|
* @return Always returns true.
|
||||||
|
*/
|
||||||
bool isBackEnabled() const override;
|
bool isBackEnabled() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Indicates whether the step is at the beginning.
|
||||||
|
* @return Always returns true.
|
||||||
|
*/
|
||||||
bool isAtBeginning() const override;
|
bool isAtBeginning() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Indicates whether the step is at the end.
|
||||||
|
* @return Always returns true.
|
||||||
|
*/
|
||||||
bool isAtEnd() const override;
|
bool isAtEnd() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Activates the step, setting up the UI based on network availability and configuration.
|
||||||
|
*/
|
||||||
void onActivate() override;
|
void onActivate() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles actions to perform when leaving the step, such as storing selected packages.
|
||||||
|
*/
|
||||||
void onLeave() override;
|
void onLeave() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the configuration map for the step.
|
||||||
|
* @param configurationMap The QVariantMap containing configuration data.
|
||||||
|
*/
|
||||||
|
void setConfigurationMap(const QVariantMap& configurationMap) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieves the current package selections.
|
||||||
|
* @return A QVariantMap of package selections.
|
||||||
|
*/
|
||||||
QVariantMap packageSelections() const { return m_packageSelections; }
|
QVariantMap packageSelections() const { return m_packageSelections; }
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
/**
|
||||||
|
* @brief Slot to handle checkbox toggle events.
|
||||||
|
* @param checked The new checked state of the checkbox.
|
||||||
|
*/
|
||||||
void updatePackageSelections(bool checked);
|
void updatePackageSelections(bool checked);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
/**
|
||||||
|
* @brief Signal emitted when package selections change.
|
||||||
|
*/
|
||||||
void packageSelectionsChanged();
|
void packageSelectionsChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QVariantMap m_packageSelections;
|
/**
|
||||||
Ui::pkgselect *ui;
|
* @brief Retrieves the checkbox associated with a given package ID.
|
||||||
QWidget* m_widget;
|
* @param id The package ID.
|
||||||
|
* @return A pointer to the QCheckBox, or nullptr if not found.
|
||||||
|
*/
|
||||||
|
QCheckBox* getCheckboxById(const QString& id) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if a given key exists in package selections and is set to true.
|
||||||
|
* @param key The key to check.
|
||||||
|
* @return True if the key exists and is true, otherwise false.
|
||||||
|
*/
|
||||||
bool exists_and_true(const QString& key) const;
|
bool exists_and_true(const QString& key) const;
|
||||||
|
|
||||||
|
QVariantMap m_packageSelections; ///< Stores the state of package selections.
|
||||||
|
Ui::pkgselect* ui; ///< Pointer to the UI class.
|
||||||
|
QWidget* m_widget; ///< Pointer to the main widget of the step.
|
||||||
|
QVariantMap m_configurationMap; ///< Stores configuration data.
|
||||||
|
|
||||||
|
QMap<QString, QCheckBox*> m_packageCheckBoxes; ///< Maps package IDs to their corresponding checkboxes.
|
||||||
|
bool m_connectionsMade; ///< Flag to ensure signal connections are made only once.
|
||||||
};
|
};
|
||||||
|
|
||||||
CALAMARES_PLUGIN_FACTORY_DECLARATION( PackageSelectViewStepFactory )
|
CALAMARES_PLUGIN_FACTORY_DECLARATION(PackageSelectViewStepFactory)
|
||||||
|
|
||||||
#endif
|
#endif // PACKAGESELECTVIEWSTEP_H
|
||||||
|
51
common/modules/pkgselect/pkgselect.conf
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
additional_packages:
|
||||||
|
- id: "element-desktop"
|
||||||
|
name: "Element"
|
||||||
|
description: "Matrix-based end-to-end encrypted messenger and secure collaboration app."
|
||||||
|
snap: true
|
||||||
|
- id: "thunderbird"
|
||||||
|
name: "Thunderbird"
|
||||||
|
description: "Email, newsfeed, chat, and calendaring client."
|
||||||
|
snap: true
|
||||||
|
- id: "krita"
|
||||||
|
name: "Krita"
|
||||||
|
description: "Graphics editor designed primarily for digital art and 2D animation."
|
||||||
|
snap: true
|
||||||
|
minimal_remove_packages:
|
||||||
|
- "snapd"
|
||||||
|
- "lubuntu-snap-installation-monitor"
|
||||||
|
- "vlc"
|
||||||
|
- "plasma-discover"
|
||||||
|
- "transmission-qt"
|
||||||
|
- "quassel"
|
||||||
|
- "2048-qt"
|
||||||
|
- "featherpad"
|
||||||
|
- "noblenote"
|
||||||
|
- "kcalc"
|
||||||
|
- "qps"
|
||||||
|
- "zsync"
|
||||||
|
- "partitionmanager"
|
||||||
|
- "qapt-deb-installer"
|
||||||
|
- "picom"
|
||||||
|
- "qlipper"
|
||||||
|
- "qtpass"
|
||||||
|
- "libreoffice*"
|
||||||
|
installer_remove_packages:
|
||||||
|
- "^live-*"
|
||||||
|
- calamares-settings-lubuntu
|
||||||
|
- calamares
|
||||||
|
- zram-config
|
||||||
|
- cifs-utils
|
||||||
|
- lubuntu-installer-prompt
|
||||||
|
regular_install_packages:
|
||||||
|
- language-pack-$LOCALE
|
||||||
|
- language-pack-gnome-$LOCALE
|
||||||
|
- language-pack-kde-$LOCALE
|
||||||
|
- hunspell-$LOCALE
|
||||||
|
- libreoffice-help-$LOCALE
|
||||||
|
- libreoffice-l10n-$LOCALE
|
||||||
|
refresh_snaps:
|
||||||
|
- "firefox"
|
||||||
|
- "firmware-updater"
|
@ -11,7 +11,7 @@
|
|||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Package Selection</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QRadioButton {
|
<string notr="true">QRadioButton {
|
||||||
@ -28,6 +28,27 @@ QLabel {
|
|||||||
}</string>
|
}</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
|
||||||
|
<!-- Installation Mode Label -->
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="apps_label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>18</pointsize>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Installation Mode</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Minimal Installation Radio Button -->
|
||||||
<item row="9" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QRadioButton" name="minimal_button">
|
<widget class="QRadioButton" name="minimal_button">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
@ -46,401 +67,8 @@ QLabel {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="2">
|
|
||||||
<spacer name="right_spacer">
|
<!-- Minimal Installation Description -->
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Minimum</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="21" column="1">
|
|
||||||
<spacer name="pushup">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="20" column="0" colspan="3">
|
|
||||||
<widget class="QLabel" name="mandatory_warning_label">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>11</pointsize>
|
|
||||||
<weight>75</weight>
|
|
||||||
<italic>false</italic>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Note: Ubuntu and flavors are NOT responsible for third-party software installed from this list.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="14" column="1">
|
|
||||||
<widget class="QLabel" name="updates_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>This saves time after installation, and keeps your system secure</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<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>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QRadioButton" name="full_button">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>21</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>12</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Full Installation</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<spacer name="left_spacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Minimum</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QLabel" name="full_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>All applications in the Normal Installation, and all extra third-party packages listed below</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="1">
|
|
||||||
<spacer name="verticalSpacer_6">
|
|
||||||
<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>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="1">
|
|
||||||
<widget class="QCheckBox" name="updates_button">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>21</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>12</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Download and install updates following installation</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="18" column="1">
|
|
||||||
<spacer name="verticalSpacer_11">
|
|
||||||
<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>3</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="19" column="1">
|
|
||||||
<widget class="QScrollArea" name="extraparty_scroll">
|
|
||||||
<property name="widgetResizable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="extraparty_scrollhouse">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>762</width>
|
|
||||||
<height>281</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2">
|
|
||||||
<item row="8" column="1">
|
|
||||||
<widget class="QCheckBox" name="virtmanager_button">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>21</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Virtual Machine Manager</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QCheckBox" name="element_button">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>21</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Element</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="11" column="1">
|
|
||||||
<widget class="QCheckBox" name="krita_button">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>21</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Krita</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
|
||||||
<spacer name="thunderbird_spacer">
|
|
||||||
<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>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLabel" name="element_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Matrix-based end-to-end encrypted messenger and secure collaboration app</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="10" column="1">
|
|
||||||
<spacer name="verticalSpacer_10">
|
|
||||||
<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>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="9" column="1">
|
|
||||||
<widget class="QLabel" name="virtmanager_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Desktop user interface for managing virtual machines through libvirt</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<spacer name="verticalSpacer_4">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>1</width>
|
|
||||||
<height>5</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QLabel" name="thunderbird_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Email, newsfeed, chat, and calendaring client</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QCheckBox" name="thunderbird_button">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>21</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Thunderbird</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<spacer name="verticalSpacer_8">
|
|
||||||
<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>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="1">
|
|
||||||
<spacer name="pushup_tiny">
|
|
||||||
<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 row="1" column="0">
|
|
||||||
<spacer name="horizontalSpacer_12">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>5</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="12" column="1">
|
|
||||||
<widget class="QLabel" name="krita_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Graphics editor designed primarily for digital art and 2D animation</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="10" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="minimal_text">
|
<widget class="QLabel" name="minimal_text">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -454,69 +82,8 @@ QLabel {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="1">
|
|
||||||
<spacer name="verticalSpacer_3">
|
<!-- Normal Installation Radio Button -->
|
||||||
<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>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLabel" name="apps_label">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>18</pointsize>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Installation Mode</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="12" column="1">
|
|
||||||
<widget class="QLabel" name="additional_label">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>18</pointsize>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Additional Options</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="1">
|
|
||||||
<widget class="QLabel" name="normal_text">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
<italic>true</italic>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Web browser, utilities, office software, games, and media players</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QRadioButton" name="normal_button">
|
<widget class="QRadioButton" name="normal_button">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
@ -538,6 +105,216 @@ QLabel {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
|
<!-- Normal Installation Description -->
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QLabel" name="normal_text">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
<italic>true</italic>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Web browser, utilities, office software, games, and media players</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Full Installation Radio Button -->
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QRadioButton" name="full_button">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>21</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>12</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Full Installation</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Full Installation Description -->
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="full_text">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
<italic>true</italic>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>All applications in the Normal Installation, and all extra third-party packages listed below</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Spacer Elements -->
|
||||||
|
<item row="0" column="0">
|
||||||
|
<spacer name="left_spacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Minimum</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<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>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<spacer name="right_spacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Minimum</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="1">
|
||||||
|
<spacer name="verticalSpacer_6">
|
||||||
|
<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>10</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Additional Options Label -->
|
||||||
|
<item row="12" column="1">
|
||||||
|
<widget class="QLabel" name="additional_label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>18</pointsize>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Additional Options</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Update Checkbox -->
|
||||||
|
<item row="13" column="1">
|
||||||
|
<widget class="QCheckBox" name="updates_button">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>21</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>12</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Download and install updates following installation</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Updates Text -->
|
||||||
|
<item row="14" column="1">
|
||||||
|
<widget class="QLabel" name="updates_text">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
<italic>true</italic>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>This saves time after installation, and keeps your system secure</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Mandatory Warning Label -->
|
||||||
|
<item row="20" column="0" colspan="3">
|
||||||
|
<widget class="QLabel" name="mandatory_warning_label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>11</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<italic>false</italic>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Note: Ubuntu and flavors are NOT responsible for third-party software installed from this list.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Pushup Spacer -->
|
||||||
|
<item row="21" column="1">
|
||||||
|
<spacer name="pushup">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Additional Packages Label -->
|
||||||
<item row="16" column="1">
|
<item row="16" column="1">
|
||||||
<widget class="QLabel" name="extraparty_text">
|
<widget class="QLabel" name="extraparty_text">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -555,51 +332,47 @@ QLabel {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="1">
|
|
||||||
<spacer name="verticalSpacer_2">
|
<!-- Scroll Area for Additional Packages -->
|
||||||
|
<item row="19" column="1">
|
||||||
|
<widget class="QScrollArea" name="extraparty_scroll">
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="extraparty_scrollhouse">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>762</width>
|
||||||
|
<height>281</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="packages_layout">
|
||||||
|
<!-- Dynamic Checkboxes will be added here -->
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- Stretch to Push Elements Up -->
|
||||||
|
<item row="22" column="1">
|
||||||
|
<spacer name="stretch_spacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeType">
|
<property name="sizeType">
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
<enum>QSizePolicy::Expanding</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>40</height>
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<spacer name="verticalSpacer_5">
|
|
||||||
<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>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="17" column="1">
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
37
common/modules/pkgselectprocess/CMakeLists.txt
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(FeatureSummary)
|
||||||
|
|
||||||
|
set( CMAKE_CXX_STANDARD 23 )
|
||||||
|
set( CMAKE_CXX_STANDARD_REQUIRED ON )
|
||||||
|
|
||||||
|
find_library(APT_PKG_LIB apt-pkg)
|
||||||
|
if (NOT APT_PKG_LIB)
|
||||||
|
message(FATAL_ERROR "Could not find libapt-pkg")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(ECM "6.0.0" NO_MODULE)
|
||||||
|
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})
|
||||||
|
find_package(KF6 REQUIRED COMPONENTS CoreAddons)
|
||||||
|
include(KDEInstallDirs)
|
||||||
|
|
||||||
|
set( CALAMARES_VERSION_REQUIRED 3.3.9 )
|
||||||
|
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} NO_CMAKE_PACKAGE_REGISTRY)
|
||||||
|
if (NOT TARGET Calamares::calamares OR NOT TARGET Calamares::calamaresui)
|
||||||
|
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Found Calamares version ${Calamares_VERSION}")
|
||||||
|
message(STATUS " libraries ${Calamares_LIB_DIRS}")
|
||||||
|
message(STATUS "")
|
||||||
|
|
||||||
|
calamares_add_plugin( pkgselectprocess
|
||||||
|
TYPE job
|
||||||
|
EXPORT_MACRO PLUGINDLLEXPORT_PRO
|
||||||
|
SOURCES
|
||||||
|
PackageSelectProcess.cpp
|
||||||
|
SHARED_LIB
|
||||||
|
NO_CONFIG
|
||||||
|
)
|
||||||
|
add_executable(check_package checkpackage-backend.cpp)
|
||||||
|
target_link_libraries(check_package PRIVATE ${APT_PKG_LIB})
|
573
common/modules/pkgselectprocess/PackageSelectProcess.cpp
Normal file
@ -0,0 +1,573 @@
|
|||||||
|
#include "PackageSelectProcess.h"
|
||||||
|
#include "GlobalStorage.h"
|
||||||
|
#include "JobQueue.h"
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QRegularExpression>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
CALAMARES_PLUGIN_FACTORY_DEFINITION(PackageSelectProcessFactory, registerPlugin<PackageSelectProcess>();)
|
||||||
|
|
||||||
|
PackageSelectProcess::PackageSelectProcess(QObject* parent)
|
||||||
|
: Calamares::CppJob(parent),
|
||||||
|
m_prettyStatus(tr("Preparing to install selected packages..."))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PackageSelectProcess::prettyName() const
|
||||||
|
{
|
||||||
|
return tr("Installing selected packages");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PackageSelectProcess::prettyStatusMessage() const
|
||||||
|
{
|
||||||
|
return m_prettyStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PackageSelectProcess::setConfigurationMap(const QVariantMap& configurationMap)
|
||||||
|
{
|
||||||
|
m_configurationMap = configurationMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
Calamares::JobResult PackageSelectProcess::runAptCommand(const QString& command,
|
||||||
|
const QString& rootMountPoint,
|
||||||
|
double startProgress,
|
||||||
|
double endProgress,
|
||||||
|
bool verboseProgress)
|
||||||
|
{
|
||||||
|
qDebug() << "Running apt command:" << command;
|
||||||
|
QProcess aptProcess(this);
|
||||||
|
aptProcess.setProgram("/usr/sbin/chroot");
|
||||||
|
aptProcess.setArguments({ rootMountPoint, "/bin/bash", "-c", command });
|
||||||
|
aptProcess.setProcessChannelMode(QProcess::MergedChannels);
|
||||||
|
|
||||||
|
constexpr int MAX_LINES = 5000;
|
||||||
|
double progressRange = endProgress - startProgress;
|
||||||
|
double progressPerLine = progressRange / static_cast<double>(MAX_LINES);
|
||||||
|
int lineCount = 0;
|
||||||
|
|
||||||
|
QString commandHRPrefix;
|
||||||
|
if (command.contains("install")) {
|
||||||
|
commandHRPrefix = tr("Installing packages: ");
|
||||||
|
} else if (command.contains("full-upgrade")) {
|
||||||
|
commandHRPrefix = tr("Upgrading installed system: ");
|
||||||
|
} else if (command.contains("remove")) {
|
||||||
|
commandHRPrefix = tr("Cleaning up packages: ");
|
||||||
|
} else if (command.contains("cdrom")) {
|
||||||
|
commandHRPrefix = tr("cdrom: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
QRegularExpression getRegex(R"(Get:\d+\s+[^ ]+\s+[^ ]+\s+(.+?)\s+\S+\s+(\S+)\s+\[(.*?)\])");
|
||||||
|
|
||||||
|
connect(&aptProcess, &QProcess::readyReadStandardOutput, this,
|
||||||
|
[this, &lineCount, progressPerLine, startProgress, endProgress, verboseProgress, commandHRPrefix, getRegex]() {
|
||||||
|
QProcess *aptProcess = (QProcess *)(QObject::sender());
|
||||||
|
if (aptProcess == NULL) return;
|
||||||
|
while (aptProcess->canReadLine()) {
|
||||||
|
QString line = QString::fromUtf8(aptProcess->readLine()).trimmed();
|
||||||
|
qDebug() << "Apt log line: " << line;
|
||||||
|
if (line.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verboseProgress && !line.contains("Running in chroot, ignoring command") &&
|
||||||
|
!line.contains("Waiting until unit") && !line.contains("Stopping snap") &&
|
||||||
|
!line.contains("/dev/pts")) {
|
||||||
|
|
||||||
|
// Process "Get:" lines to show download information
|
||||||
|
if (line.startsWith("Get:")) {
|
||||||
|
QRegularExpressionMatch match = getRegex.match(line);
|
||||||
|
if (match.hasMatch()) {
|
||||||
|
QString packageName = match.captured(1);
|
||||||
|
QString packageVersion = match.captured(2);
|
||||||
|
QString packageSize = match.captured(3);
|
||||||
|
line = tr("Downloading %1 %2 (%3)").arg(packageName, packageVersion, packageSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_prettyStatus = commandHRPrefix + line;
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
qDebug() << m_prettyStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineCount++;
|
||||||
|
double currentProgress = startProgress + (lineCount * progressPerLine);
|
||||||
|
currentProgress = qBound(startProgress, currentProgress, endProgress);
|
||||||
|
emit progress(currentProgress);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
aptProcess.start();
|
||||||
|
if (!aptProcess.waitForStarted()) {
|
||||||
|
qWarning() << "Failed to start apt command:" << aptProcess.errorString();
|
||||||
|
return Calamares::JobResult::error(tr("Apt command failed"),
|
||||||
|
tr("Failed to start apt command: %1").arg(aptProcess.errorString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!aptProcess.waitForFinished(100)) {
|
||||||
|
QCoreApplication::processEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aptProcess.exitStatus() != QProcess::NormalExit || aptProcess.exitCode() != 0) {
|
||||||
|
QString errorOutput = QString::fromUtf8(aptProcess.readAllStandardError()).trimmed();
|
||||||
|
qWarning() << "Apt command error:" << errorOutput;
|
||||||
|
return Calamares::JobResult::error(tr("Apt command failed"),
|
||||||
|
tr("Failed to execute apt command: %1").arg(errorOutput));
|
||||||
|
}
|
||||||
|
|
||||||
|
emit progress(endProgress);
|
||||||
|
m_prettyStatus = tr("Command executed successfully.");
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
|
||||||
|
return Calamares::JobResult::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
Calamares::JobResult PackageSelectProcess::runSnapCommand(const QStringList& snapPackages,
|
||||||
|
const QString& rootMountPoint,
|
||||||
|
double startProgress,
|
||||||
|
double endProgress)
|
||||||
|
{
|
||||||
|
const QString seedDirectory = QDir::cleanPath(rootMountPoint + "/var/lib/snapd/seed");
|
||||||
|
QDir dir(seedDirectory);
|
||||||
|
if (!dir.exists() && !dir.mkpath(".")) {
|
||||||
|
return Calamares::JobResult::error(tr("Snap installation failed"),
|
||||||
|
tr("Failed to create seed directory: %1").arg(seedDirectory));
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList snapCommandArgs = { "--seed", seedDirectory };
|
||||||
|
snapCommandArgs += snapPackages;
|
||||||
|
|
||||||
|
qDebug() << "Executing Snap Command:" << snapCommandArgs.join(" ");
|
||||||
|
|
||||||
|
QProcess snapProcess(this);
|
||||||
|
snapProcess.setProgram("/usr/bin/snapd-seed-glue");
|
||||||
|
snapProcess.setArguments(snapCommandArgs);
|
||||||
|
snapProcess.setProcessChannelMode(QProcess::MergedChannels);
|
||||||
|
|
||||||
|
QString currentDescription;
|
||||||
|
|
||||||
|
connect(&snapProcess, &QProcess::readyReadStandardOutput, this,
|
||||||
|
[&snapProcess, this, ¤tDescription, startProgress, endProgress]( ) {
|
||||||
|
while (snapProcess.canReadLine()) {
|
||||||
|
QString line = QString::fromUtf8(snapProcess.readLine()).trimmed();
|
||||||
|
if (line.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList parts = line.split("\t");
|
||||||
|
if (parts.size() != 2) {
|
||||||
|
qWarning() << "Unexpected output format from snap-seed-glue:" << line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ok = false;
|
||||||
|
double percentage = parts[0].toDouble(&ok);
|
||||||
|
const QString& description = parts[1];
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
qWarning() << "Failed to parse percentage from line:" << line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (description != currentDescription) {
|
||||||
|
m_prettyStatus = description;
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
currentDescription = description;
|
||||||
|
qDebug() << description;
|
||||||
|
}
|
||||||
|
|
||||||
|
double scaledProgress = startProgress + (percentage / 100.0) * (endProgress - startProgress);
|
||||||
|
emit progress(scaledProgress);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
m_prettyStatus = tr("Installing snap packages...");
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
emit progress(startProgress);
|
||||||
|
|
||||||
|
snapProcess.start();
|
||||||
|
if (!snapProcess.waitForStarted()) {
|
||||||
|
qWarning() << "Failed to start snap installation process:" << snapProcess.errorString();
|
||||||
|
return Calamares::JobResult::error(tr("Snap installation failed"),
|
||||||
|
tr("Failed to start snap installation process: %1").arg(snapProcess.errorString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!snapProcess.waitForFinished(100)) {
|
||||||
|
QCoreApplication::processEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (snapProcess.exitStatus() != QProcess::NormalExit || snapProcess.exitCode() != 0) {
|
||||||
|
QString errorOutput = QString::fromUtf8(snapProcess.readAllStandardError()).trimmed();
|
||||||
|
qWarning() << "Snap installation error:" << errorOutput;
|
||||||
|
return Calamares::JobResult::error(tr("Snap installation failed"),
|
||||||
|
tr("Failed to install snap packages: %1").arg(errorOutput));
|
||||||
|
}
|
||||||
|
|
||||||
|
emit progress(endProgress);
|
||||||
|
m_prettyStatus = tr("Snap packages installed successfully!");
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
|
||||||
|
return Calamares::JobResult::ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PackageSelectProcess::divert(bool enable)
|
||||||
|
{
|
||||||
|
for (auto it = dpkgDiversions.constBegin(); it != dpkgDiversions.constEnd(); ++it) {
|
||||||
|
const QString& name = it.key();
|
||||||
|
const QString& path = it.value();
|
||||||
|
QString divertedPath = path + ".REAL";
|
||||||
|
QString command;
|
||||||
|
|
||||||
|
if (enable) {
|
||||||
|
qDebug() << tr("Adding diversion for %1...").arg(name);
|
||||||
|
command = QString("dpkg-divert --quiet --add --divert %1 --rename %2")
|
||||||
|
.arg(divertedPath, path);
|
||||||
|
} else {
|
||||||
|
qDebug() << tr("Removing diversion for %1...").arg(name);
|
||||||
|
QFile::remove(rootMountPoint + path);
|
||||||
|
command = QString("dpkg-divert --quiet --remove --rename %1").arg(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up the QProcess to run the command in chroot
|
||||||
|
QProcess process;
|
||||||
|
process.setProgram("/usr/sbin/chroot");
|
||||||
|
process.setArguments({ rootMountPoint, "/bin/bash", "-c", command });
|
||||||
|
process.setProcessChannelMode(QProcess::MergedChannels);
|
||||||
|
|
||||||
|
// Run the process
|
||||||
|
process.start();
|
||||||
|
if (!process.waitForFinished()) {
|
||||||
|
qWarning() << "Process error:" << process.errorString();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) {
|
||||||
|
qWarning() << "Error handling diversion for" << name << ":" << process.readAll();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enable) { continue; }
|
||||||
|
|
||||||
|
// Create the replacement script in chroot
|
||||||
|
QString scriptContent = QString(
|
||||||
|
"#!/bin/sh\n"
|
||||||
|
"echo \"%1: diverted (will be called later)\" >&1\n"
|
||||||
|
"exit 0\n"
|
||||||
|
).arg(name);
|
||||||
|
|
||||||
|
QString scriptPath = rootMountPoint + path;
|
||||||
|
QFile scriptFile(scriptPath);
|
||||||
|
|
||||||
|
if (!scriptFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
qWarning() << "Error creating script for" << name << ":" << scriptFile.errorString();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream out(&scriptFile);
|
||||||
|
out << scriptContent;
|
||||||
|
scriptFile.close();
|
||||||
|
|
||||||
|
// Make the script executable
|
||||||
|
QFile::setPermissions(scriptPath, QFile::permissions(scriptPath) | QFile::ExeOwner | QFile::ExeGroup | QFile::ExeOther);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Calamares::JobResult PackageSelectProcess::exec()
|
||||||
|
{
|
||||||
|
auto gs = Calamares::JobQueue::instance()->globalStorage();
|
||||||
|
if (!gs || !gs->contains("installation_data")) {
|
||||||
|
return Calamares::JobResult::error(tr("No installation data found."),
|
||||||
|
tr("Installation data is missing from global storage."));
|
||||||
|
}
|
||||||
|
|
||||||
|
const QVariantMap installationData = gs->value("installation_data").toMap();
|
||||||
|
const QString installationMode = installationData.value("installation_mode").toString();
|
||||||
|
const bool hasInternet = gs->value("hasInternet").toBool();
|
||||||
|
const bool downloadUpdates = (installationData.value("download_updates").toBool() && hasInternet);
|
||||||
|
const QVariantList packagesToInstall = installationData.value("packages_to_install").toList();
|
||||||
|
const QVariantList packagesToRemove = installationData.value("packages_to_remove").toList();
|
||||||
|
const QVariantList presentSnaps = installationData.value("present_snaps").toList();
|
||||||
|
|
||||||
|
// Handle default value for rootMountPoint
|
||||||
|
rootMountPoint = "/";
|
||||||
|
if (gs->contains("rootMountPoint")) {
|
||||||
|
rootMountPoint = gs->value("rootMountPoint").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString checkpackage_path = "/usr/libexec/checkpackage-backend";
|
||||||
|
const QString chroot_checkpackage_path = rootMountPoint + checkpackage_path;
|
||||||
|
QFile* cpbe = new QFile(chroot_checkpackage_path);
|
||||||
|
|
||||||
|
static const QMap<QString, QVector<ProgressAllocation>> allocationMap = {
|
||||||
|
{ "minimal", { {0.0, 1.0} } },
|
||||||
|
{ "normal", { {0.0, 0.4}, {0.4, 1.0} } },
|
||||||
|
{ "full", { {0.0, 0.25}, {0.25, 1.0} } }
|
||||||
|
};
|
||||||
|
|
||||||
|
const QVector<ProgressAllocation> allocations = allocationMap.value(installationMode, { {0.0, 1.0} });
|
||||||
|
const double aptRange = allocations[0].end - allocations[0].start;
|
||||||
|
const double updateStart = allocations[0].start;
|
||||||
|
const double updateEnd = updateStart + 0.1 * aptRange;
|
||||||
|
|
||||||
|
// Temporarily copy ubuntu.sources elsewhere, if we do not have network
|
||||||
|
// This is so we can update the apt cache safely
|
||||||
|
// FIXME: there has to be a better, more native way to do this. It works
|
||||||
|
// for now, but in the 25.10 cycle, we're probably going to move some of
|
||||||
|
// these command-line apt calls to the libapt C library. LP: #2107287
|
||||||
|
if (!hasInternet) {
|
||||||
|
const QString ubuntu_sources_path = rootMountPoint + "/etc/apt/sources.list.d/ubuntu.sources";
|
||||||
|
QFile* ubuntu_sources = new QFile(ubuntu_sources_path);
|
||||||
|
// Just in case this module is used in a non-Ubuntu environment, make sure ubuntu.sources exists
|
||||||
|
// TODO: make this configurable in the 25.10 cycle
|
||||||
|
if (ubuntu_sources->exists()) {
|
||||||
|
const QString backup_name = ubuntu_sources_path + ".bak";
|
||||||
|
if (!ubuntu_sources->rename(ubuntu_sources_path + ".bak")) {
|
||||||
|
return Calamares::JobResult::error(tr("Internal Error"),
|
||||||
|
tr("Permission denied when moving ubuntu.sources to prepare for offline install"));
|
||||||
|
}
|
||||||
|
Calamares::JobResult addCdromResult = runAptCommand("apt-cdrom add -m -d=/media/cdrom/", rootMountPoint, updateStart, updateEnd, true);
|
||||||
|
if (!addCdromResult) return std::move(addCdromResult);
|
||||||
|
} else {
|
||||||
|
return Calamares::JobResult::error(tr("Internal Error"),
|
||||||
|
tr("/etc/apt/sources.list.d/ubuntu.sources not found in the target, are you a downstream?"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run apt update
|
||||||
|
m_prettyStatus = tr("Updating apt cache");
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
emit progress(updateStart);
|
||||||
|
|
||||||
|
Calamares::JobResult updateResult = runAptCommand("DEBIAN_FRONTEND=noninteractive apt-get update",
|
||||||
|
rootMountPoint,
|
||||||
|
updateStart,
|
||||||
|
updateEnd,
|
||||||
|
false);
|
||||||
|
if (!updateResult) { // Using operator bool() to check for errors
|
||||||
|
return std::move(updateResult); // Move to avoid copy
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList debPackages;
|
||||||
|
for (const QVariant& var : packagesToInstall) {
|
||||||
|
const QVariantMap pkg = var.toMap();
|
||||||
|
if (!pkg.value("snap").toBool()) {
|
||||||
|
debPackages << pkg.value("id").toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add diversions for dracut, update-initramfs, and locale-gen
|
||||||
|
/*
|
||||||
|
dpkgDiversions = {
|
||||||
|
{"dracut", "/usr/bin/dracut"},
|
||||||
|
{"update-initramfs", "/usr/sbin/update-initramfs"},
|
||||||
|
{"locale-gen", "/usr/sbin/locale-gen"}
|
||||||
|
};
|
||||||
|
divert(true);
|
||||||
|
*/
|
||||||
|
|
||||||
|
double installStart;
|
||||||
|
double installEnd;
|
||||||
|
if (downloadUpdates) {
|
||||||
|
const double upgradeStart = updateEnd;
|
||||||
|
const double upgradeEnd = upgradeStart + 0.25 * aptRange;
|
||||||
|
|
||||||
|
Calamares::JobResult upgradeResult = runAptCommand(
|
||||||
|
"DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::='--force-confnew' full-upgrade",
|
||||||
|
rootMountPoint,
|
||||||
|
upgradeStart,
|
||||||
|
upgradeEnd,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
if (!upgradeResult) { // Using operator bool() to check for errors
|
||||||
|
return std::move(upgradeResult); // Move to avoid copy
|
||||||
|
}
|
||||||
|
|
||||||
|
installStart = upgradeEnd;
|
||||||
|
installEnd = installStart + 0.25 * aptRange;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
installStart = updateEnd;
|
||||||
|
installEnd = installStart + 0.5 * aptRange;
|
||||||
|
installEnd = qMin(installEnd, allocations[0].end);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "Progress range: installStart:" << installStart << "installEnd:" << installEnd;
|
||||||
|
|
||||||
|
if (!debPackages.isEmpty()) {
|
||||||
|
// Corresponding to the temporary hack in pkgselect adding calamares
|
||||||
|
// and kdialog to the list, we only want those two included in the
|
||||||
|
// final installation if we're actually in OEM mode. Otherwise, they
|
||||||
|
// can be ignored, and are just clutter.
|
||||||
|
// FIXME: When the OEM stack is rewritten in 25.10, this needs to be
|
||||||
|
// removed.
|
||||||
|
if (!QFile::exists("/etc/calamares/OEM_MODE_ACTIVATED")) {
|
||||||
|
QStringList wip_list;
|
||||||
|
for (auto debPackage : debPackages) {
|
||||||
|
if (!debPackage.contains(QString("calamares")) &&
|
||||||
|
!debPackage.contains(QString("kdialog"))) {
|
||||||
|
wip_list << debPackage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debPackages = wip_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// checkpackage-backend needs to be explicitly copied to the chroot
|
||||||
|
// and removed later for systems with stacked squashfses, or the
|
||||||
|
// install command will fail. LP: #2104243
|
||||||
|
if (!cpbe->exists()) {
|
||||||
|
QFile* parent_cpbe = new QFile(checkpackage_path);
|
||||||
|
if (!parent_cpbe->copy(chroot_checkpackage_path)) {
|
||||||
|
return Calamares::JobResult::error(tr("Internal Error"),
|
||||||
|
tr("Permission denied when copying checkpackage-backend, are you running Calamares correctly?"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString packageList = debPackages.join(" ");
|
||||||
|
const QString installCommand = QString("DEBIAN_FRONTEND=noninteractive apt-get -y install $(/usr/libexec/checkpackage-backend %1);").arg(packageList);
|
||||||
|
|
||||||
|
Calamares::JobResult installResult = runAptCommand(installCommand,
|
||||||
|
rootMountPoint,
|
||||||
|
installStart,
|
||||||
|
installEnd,
|
||||||
|
true);
|
||||||
|
if (!installResult) {
|
||||||
|
if (!cpbe->remove()) qDebug() << "Warning: failed to clean up /usr/libexec/checkpackage-backend";
|
||||||
|
return std::move(installResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else qDebug() << "No packages to install.";
|
||||||
|
|
||||||
|
QStringList removeDebPackages;
|
||||||
|
for (const QVariant& var : packagesToRemove) {
|
||||||
|
removeDebPackages << var.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// As part of the fix for LP: #2104343, we need to ensure that, if
|
||||||
|
// we are currently in OEM mode, Calamares and friends remain
|
||||||
|
// installed. During stage two, we clean it up.
|
||||||
|
// FIXME: When the OEM stack is rewritten in 25.10, this needs to be
|
||||||
|
// rewritten.
|
||||||
|
if (QFile::exists("/etc/calamares/OEM_MODE_ACTIVATED")) {
|
||||||
|
QStringList wip_list;
|
||||||
|
for (auto removeDebPackage : removeDebPackages) {
|
||||||
|
if (!removeDebPackage.contains(QString("calamares"))) wip_list << removeDebPackage;
|
||||||
|
}
|
||||||
|
removeDebPackages = wip_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double removeStart = installEnd;
|
||||||
|
const double removeEnd = removeStart + 0.2 * aptRange;
|
||||||
|
|
||||||
|
if (!removeDebPackages.isEmpty()) {
|
||||||
|
const QString removeCommand = QString("DEBIAN_FRONTEND=noninteractive apt-get -y --purge remove $(/usr/libexec/checkpackage-backend %1);")
|
||||||
|
.arg(removeDebPackages.join(" "));
|
||||||
|
Calamares::JobResult removeResult = runAptCommand(removeCommand,
|
||||||
|
rootMountPoint,
|
||||||
|
removeStart,
|
||||||
|
removeEnd,
|
||||||
|
true);
|
||||||
|
if (!removeResult) return std::move(removeResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
const double autoremoveStart = removeEnd;
|
||||||
|
const double autoremoveEnd = autoremoveStart + 0.2 * aptRange;
|
||||||
|
|
||||||
|
Calamares::JobResult autoremoveResult = runAptCommand("DEBIAN_FRONTEND=noninteractive apt-get -y autoremove",
|
||||||
|
rootMountPoint,
|
||||||
|
autoremoveStart,
|
||||||
|
autoremoveEnd,
|
||||||
|
true);
|
||||||
|
|
||||||
|
// Disable diversions
|
||||||
|
//divert(false);
|
||||||
|
|
||||||
|
// Move ubuntu.sources back, and clean up the cdrom file
|
||||||
|
// FIXME: there has to be a better, more native way to do this. It works
|
||||||
|
// for now, but in the 25.10 cycle, we're probably going to move some of
|
||||||
|
// these command-line apt calls to the libapt C library. LP: #2107287
|
||||||
|
try {
|
||||||
|
if (!hasInternet) {
|
||||||
|
const QString ubuntu_sources_path = rootMountPoint + "/etc/apt/sources.list.d/ubuntu.sources";
|
||||||
|
const QString backup_name = ubuntu_sources_path + ".bak";
|
||||||
|
QFile* ubuntu_sources = new QFile(ubuntu_sources_path);
|
||||||
|
QFile* ubuntu_sources_bak = new QFile(backup_name);
|
||||||
|
// Just in case this module is used in a non-Ubuntu environment, make sure ubuntu.sources exists
|
||||||
|
// TODO: make this configurable in the 25.10 cycle
|
||||||
|
if (ubuntu_sources->exists()) {
|
||||||
|
if (!ubuntu_sources->remove()) {
|
||||||
|
return Calamares::JobResult::error(tr("Internal Error"),
|
||||||
|
tr("/etc/apt/sources.list.d/ubuntu.sources already exists and it won't budge - this is a rare edge case, please report!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!ubuntu_sources_bak->rename(ubuntu_sources_path)) {
|
||||||
|
return Calamares::JobResult::error(tr("Internal Error"),
|
||||||
|
tr("Permission denied when moving ubuntu.sources back after offline install"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the apt-cdrom entry we added earlier
|
||||||
|
// This may seem drastic, but we already expect that the automirror
|
||||||
|
// module, ran before this, creates a deb822-style ubuntu.sources
|
||||||
|
QFile* cdrom_sources_list = new QFile(rootMountPoint + "/etc/apt/sources.list");
|
||||||
|
if (!cdrom_sources_list->remove()) {
|
||||||
|
return Calamares::JobResult::error(tr("Internal Error"),
|
||||||
|
tr("Failed to remove classic sources.list file"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (const std::exception &exc) {
|
||||||
|
qDebug() << exc.what();
|
||||||
|
} catch (...) {
|
||||||
|
qDebug() << "Caught unknown error";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle snap packages
|
||||||
|
if (installationMode != "minimal") {
|
||||||
|
QStringList snapPackages;
|
||||||
|
QStringList presentSnapsList;
|
||||||
|
// Convert QVariantList to QStringList
|
||||||
|
for (const QVariant& var : presentSnaps) {
|
||||||
|
presentSnapsList << var.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const QVariant& var : packagesToInstall) {
|
||||||
|
const QVariantMap pkg = var.toMap();
|
||||||
|
if (pkg.value("snap").toBool()) {
|
||||||
|
snapPackages << pkg.value("id").toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList finalSnapPackages;
|
||||||
|
|
||||||
|
if (!snapPackages.isEmpty() && !presentSnapsList.isEmpty()) {
|
||||||
|
finalSnapPackages = presentSnapsList + snapPackages;
|
||||||
|
}
|
||||||
|
else if (!snapPackages.isEmpty()) {
|
||||||
|
finalSnapPackages = snapPackages;
|
||||||
|
}
|
||||||
|
else if (!presentSnapsList.isEmpty() && downloadUpdates) {
|
||||||
|
finalSnapPackages = presentSnapsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!finalSnapPackages.isEmpty()) {
|
||||||
|
double snapStart = allocations.size() > 1 ? allocations[1].start : allocations[0].end;
|
||||||
|
double snapEnd = allocations.size() > 1 ? allocations[1].end : allocations[0].end;
|
||||||
|
|
||||||
|
Calamares::JobResult snapResult = runSnapCommand(finalSnapPackages,
|
||||||
|
rootMountPoint,
|
||||||
|
snapStart,
|
||||||
|
snapEnd);
|
||||||
|
if (!snapResult) { // Using operator bool() to check for errors
|
||||||
|
return std::move(snapResult); // Move to avoid copy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emit progress(1.0);
|
||||||
|
m_prettyStatus = tr("All selected packages installed successfully.");
|
||||||
|
emit prettyStatusMessageChanged(m_prettyStatus);
|
||||||
|
|
||||||
|
if (!cpbe->remove()) qDebug() << "Warning: failed to clean up /usr/libexec/checkpackage-backend";
|
||||||
|
|
||||||
|
return Calamares::JobResult::ok();
|
||||||
|
}
|
60
common/modules/pkgselectprocess/PackageSelectProcess.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#ifndef PACKAGESELECTPROCESS_H
|
||||||
|
#define PACKAGESELECTPROCESS_H
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
#include <QVariantMap>
|
||||||
|
#include "CppJob.h"
|
||||||
|
#include "utils/PluginFactory.h"
|
||||||
|
#include "DllMacro.h"
|
||||||
|
|
||||||
|
class QProcess;
|
||||||
|
|
||||||
|
class PLUGINDLLEXPORT PackageSelectProcess : public Calamares::CppJob
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PackageSelectProcess(QObject* parent = nullptr);
|
||||||
|
~PackageSelectProcess() override = default;
|
||||||
|
|
||||||
|
QString prettyName() const override;
|
||||||
|
QString prettyStatusMessage() const override;
|
||||||
|
|
||||||
|
Calamares::JobResult exec() override;
|
||||||
|
|
||||||
|
void setConfigurationMap(const QVariantMap& configurationMap) override;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void prettyStatusMessageChanged(const QString&);
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct ProgressAllocation
|
||||||
|
{
|
||||||
|
double start;
|
||||||
|
double end;
|
||||||
|
};
|
||||||
|
|
||||||
|
Calamares::JobResult runAptCommand(const QString& command,
|
||||||
|
const QString& rootMountPoint,
|
||||||
|
double startProgress,
|
||||||
|
double endProgress,
|
||||||
|
bool verboseProgress);
|
||||||
|
Calamares::JobResult runSnapCommand(const QStringList& snapPackages,
|
||||||
|
const QString& rootMountPoint,
|
||||||
|
double startProgress,
|
||||||
|
double endProgress);
|
||||||
|
|
||||||
|
void divert(bool enable);
|
||||||
|
|
||||||
|
QMap<QString, QString> dpkgDiversions;
|
||||||
|
QString rootMountPoint;
|
||||||
|
|
||||||
|
QVariantMap m_configurationMap;
|
||||||
|
QString m_prettyStatus;
|
||||||
|
};
|
||||||
|
|
||||||
|
CALAMARES_PLUGIN_FACTORY_DECLARATION(PackageSelectProcessFactory)
|
||||||
|
|
||||||
|
#endif // PACKAGESELECTPROCESS_H
|
54
common/modules/pkgselectprocess/checkpackage-backend.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <apt-pkg/algorithms.h>
|
||||||
|
#include <apt-pkg/cacheiterators.h>
|
||||||
|
#include <apt-pkg/init.h>
|
||||||
|
#include <apt-pkg/cachefile.h>
|
||||||
|
#include <apt-pkg/pkgcache.h>
|
||||||
|
#include <apt-pkg/pkgsystem.h>
|
||||||
|
#include <apt-pkg/progress.h>
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
pkgInitConfig(*_config);
|
||||||
|
pkgInitSystem(*_config, _system);
|
||||||
|
if (_system == 0) {
|
||||||
|
std::cerr << "apt-pkg not initialized\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the package cache.
|
||||||
|
pkgCacheFile *cache = new pkgCacheFile();
|
||||||
|
OpProgress progress;
|
||||||
|
if (!cache || cache->Open(&progress, false) == false) {
|
||||||
|
std::cerr << "Error: could not open APT cache.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pkgApplyStatus(*cache);
|
||||||
|
|
||||||
|
std::vector<std::string> package_names(argv + 1, argv + argc);
|
||||||
|
if (package_names.empty()) return 0;
|
||||||
|
|
||||||
|
std::unordered_set<std::string> seen_packages;
|
||||||
|
for (std::string package_name : package_names) {
|
||||||
|
if (seen_packages.contains(package_name)) continue;
|
||||||
|
seen_packages.insert(package_name);
|
||||||
|
|
||||||
|
// Tasks and wildcards should just be passed through as-is, for now
|
||||||
|
if (package_name.starts_with('^') || package_name.contains('*')) {
|
||||||
|
std::cout << package_name << " ";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
pkgCache::GrpIterator grp = cache->GetPkgCache()->FindGrp(package_name);
|
||||||
|
if (!grp.end()) {
|
||||||
|
pkgCache::PkgIterator it = grp.FindPreferredPkg(true);
|
||||||
|
if (!it.end() && !it.VersionList().end()) {
|
||||||
|
std::cout << package_name << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "\n";
|
||||||
|
cache->Close();
|
||||||
|
return 0;
|
||||||
|
}
|
7
common/modules/pkgselectprocess/module.desc
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
type: "job"
|
||||||
|
name: "pkgselectprocess"
|
||||||
|
interface: "qtplugin"
|
||||||
|
load: "libcalamares_job_pkgselectprocess.so"
|
||||||
|
noconfig: true
|
||||||
|
weight: 12
|
@ -1,5 +0,0 @@
|
|||||||
module snap-seed-glue
|
|
||||||
|
|
||||||
go 1.22.1
|
|
||||||
|
|
||||||
require github.com/snapcore/snapd v0.0.0-20240328101726-fdc222fc37a0
|
|
@ -1,289 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
// Copyright (C) 2024 Simon Quigley <tsimonq2@ubuntu.com>
|
|
||||||
//
|
|
||||||
// This program 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.
|
|
||||||
//
|
|
||||||
// This program 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.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/snapcore/snapd/snap"
|
|
||||||
"github.com/snapcore/snapd/interfaces/builtin"
|
|
||||||
"gopkg.in/yaml.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
type seed struct {
|
|
||||||
Snaps []struct {
|
|
||||||
Name string `yaml:"name"`
|
|
||||||
Channel string `yaml:"channel"`
|
|
||||||
File string `yaml:"file"`
|
|
||||||
} `yaml:"snaps"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
snap.SanitizePlugsSlots = builtin.SanitizePlugsSlots
|
|
||||||
|
|
||||||
var seed_directory string
|
|
||||||
flag.StringVar(&seed_directory, "seed", "/var/lib/snapd/seed", "Specify the seed directory")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
snap_set := make(map[string]bool)
|
|
||||||
|
|
||||||
snaps_dir := filepath.Join(seed_directory, "snaps")
|
|
||||||
assertions_dir := filepath.Join(seed_directory, "assertions")
|
|
||||||
seed_yaml := filepath.Join(seed_directory, "seed.yaml")
|
|
||||||
|
|
||||||
ensure_seed_yaml(seed_yaml)
|
|
||||||
|
|
||||||
existing_snaps_in_yaml := load_existing_snaps(seed_yaml)
|
|
||||||
|
|
||||||
for _, snap_info := range flag.Args() {
|
|
||||||
parts := strings.SplitN(snap_info, "=", 2)
|
|
||||||
snap_name := parts[0]
|
|
||||||
channel := "stable" // Default to stable if no channel is specified
|
|
||||||
if len(parts) == 2 {
|
|
||||||
channel = parts[1]
|
|
||||||
}
|
|
||||||
process_snap_with_prereqs(snap_name, channel, &snap_set, snaps_dir, assertions_dir, seed_yaml, existing_snaps_in_yaml)
|
|
||||||
}
|
|
||||||
|
|
||||||
essentialSnaps := []string{"snapd", "bare"}
|
|
||||||
for _, snapName := range essentialSnaps {
|
|
||||||
if !existing_snaps_in_yaml[snapName] {
|
|
||||||
process_snap_with_prereqs(snapName, "stable", &snap_set, snaps_dir, assertions_dir, seed_yaml, existing_snaps_in_yaml)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
update_seed_yaml(snaps_dir, seed_yaml, snap_set, existing_snaps_in_yaml)
|
|
||||||
|
|
||||||
remove_state_json(filepath.Join(seed_directory, "..", "state.json"))
|
|
||||||
ensure_assertions(assertions_dir)
|
|
||||||
validate_seed(seed_yaml)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ensure_seed_yaml(seed_yaml string) {
|
|
||||||
if _, err := os.Stat(seed_yaml); os.IsNotExist(err) {
|
|
||||||
file, err := os.Create(seed_yaml)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to create seed.yaml: %v", err)
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
file.WriteString("snaps:\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func load_existing_snaps(seed_yaml string) map[string]bool {
|
|
||||||
file, err := ioutil.ReadFile(seed_yaml)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to read seed.yaml: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var seed_data seed
|
|
||||||
if err := yaml.Unmarshal(file, &seed_data); err != nil {
|
|
||||||
log.Fatalf("Failed to parse seed.yaml: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
existing := make(map[string]bool)
|
|
||||||
for _, snap := range seed_data.Snaps {
|
|
||||||
existing[snap.Name] = true
|
|
||||||
}
|
|
||||||
return existing
|
|
||||||
}
|
|
||||||
|
|
||||||
func update_seed_yaml(snaps_dir, seed_yaml string, snap_set map[string]bool, existing_snaps map[string]bool) {
|
|
||||||
seed_data := load_seed_data(seed_yaml)
|
|
||||||
|
|
||||||
for snap_name := range snap_set {
|
|
||||||
if !existing_snaps[snap_name] {
|
|
||||||
snap_files, err := filepath.Glob(filepath.Join(snaps_dir, fmt.Sprintf("%s_*.snap", snap_name)))
|
|
||||||
if err != nil || len(snap_files) == 0 {
|
|
||||||
log.Printf("No snap file found for %s", snap_name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
snap_file := filepath.Base(snap_files[0])
|
|
||||||
log.Printf(snap_file)
|
|
||||||
|
|
||||||
// FIXME: should put the real name of the channel in here
|
|
||||||
seed_data.Snaps = append(seed_data.Snaps, struct {
|
|
||||||
Name string `yaml:"name"`
|
|
||||||
Channel string `yaml:"channel"`
|
|
||||||
File string `yaml:"file"`
|
|
||||||
}{snap_name, "latest/stable", snap_file})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Marshal to YAML and write back to file
|
|
||||||
data, err := yaml.Marshal(&seed_data)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to marshal seed data to YAML: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := ioutil.WriteFile(seed_yaml, data, 0644); err != nil {
|
|
||||||
log.Fatalf("Failed to write updated seed.yaml: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func load_seed_data(seed_yaml string) seed {
|
|
||||||
file, err := ioutil.ReadFile(seed_yaml)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to read seed.yaml: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var seed_data seed
|
|
||||||
if err := yaml.Unmarshal(file, &seed_data); err != nil {
|
|
||||||
log.Fatalf("Failed to parse seed.yaml: %v", err)
|
|
||||||
}
|
|
||||||
return seed_data
|
|
||||||
}
|
|
||||||
|
|
||||||
func remove_state_json(state_json_path string) {
|
|
||||||
if _, err := os.Stat(state_json_path); err == nil {
|
|
||||||
os.Remove(state_json_path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func validate_seed(seed_yaml string) {
|
|
||||||
cmd := exec.Command("snap", "debug", "validate-seed", seed_yaml)
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
log.Printf("Error validating seed: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func process_snap_with_prereqs(snap_name, channel string, snap_set *map[string]bool, snaps_dir, assertions_dir, seed_yaml string, existing_snaps_in_yaml map[string]bool) {
|
|
||||||
if (*snap_set)[snap_name] {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Download the snap if not already processed or listed in seed.yaml
|
|
||||||
if !existing_snaps_in_yaml[snap_name] {
|
|
||||||
cmd := exec.Command("snap", "download", snap_name, "--channel="+channel, "--target-directory="+snaps_dir)
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
log.Printf("Error downloading snap %s from channel %s: %v", snap_name, channel, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
snap_files, err := filepath.Glob(filepath.Join(snaps_dir, fmt.Sprintf("%s_*.snap", snap_name)))
|
|
||||||
if err != nil || len(snap_files) == 0 {
|
|
||||||
log.Printf("No snap file found for %s in channel %s", snap_name, channel)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
snap_file := snap_files[0]
|
|
||||||
|
|
||||||
cmd := exec.Command("unsquashfs", "-n", "-d", filepath.Join(snaps_dir, fmt.Sprintf("%s_meta", snap_name)), snap_file, "meta/snap.yaml")
|
|
||||||
if err := cmd.Run(); err != nil {
|
|
||||||
log.Printf("Error extracting meta/snap.yaml from snap %s: %v", snap_name, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
yaml_data, err := ioutil.ReadFile(filepath.Join(snaps_dir, fmt.Sprintf("%s_meta/meta/snap.yaml", snap_name)))
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error reading snap.yaml file for %s: %v", snap_name, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
info, err := snap.InfoFromSnapYaml(yaml_data)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Error parsing snap.yaml data for %s: %v", snap_name, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
(*snap_set)[snap_name] = true
|
|
||||||
|
|
||||||
tracker := snap.SimplePrereqTracker{}
|
|
||||||
missing_provider_content_tags := tracker.MissingProviderContentTags(info, nil)
|
|
||||||
for provider_snap := range missing_provider_content_tags {
|
|
||||||
if !(*snap_set)[provider_snap] {
|
|
||||||
process_snap_with_prereqs(provider_snap, "stable", snap_set, snaps_dir, assertions_dir, seed_yaml, existing_snaps_in_yaml)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if info.Base != "" && !(*snap_set)[info.Base] {
|
|
||||||
process_snap_with_prereqs(info.Base, "stable", snap_set, snaps_dir, assertions_dir, seed_yaml, existing_snaps_in_yaml)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_files, err := filepath.Glob(filepath.Join(snaps_dir, "*.assert"))
|
|
||||||
for _, file := range assert_files {
|
|
||||||
target_path := filepath.Join(assertions_dir, filepath.Base(file))
|
|
||||||
err := os.Rename(file, target_path)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("Failed to move %s to %s: %v", file, assertions_dir, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
os.RemoveAll(filepath.Join(snaps_dir, fmt.Sprintf("%s_meta", snap_name)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ensure_assertions(assertions_dir string) {
|
|
||||||
model := "generic-classic"
|
|
||||||
brand := "generic"
|
|
||||||
series := "16"
|
|
||||||
|
|
||||||
model_assertion_path := filepath.Join(assertions_dir, "model")
|
|
||||||
account_key_assertion_path := filepath.Join(assertions_dir, "account-key")
|
|
||||||
account_assertion_path := filepath.Join(assertions_dir, "account")
|
|
||||||
|
|
||||||
// Check and generate model assertion
|
|
||||||
if _, err := os.Stat(model_assertion_path); os.IsNotExist(err) {
|
|
||||||
output, err := exec.Command("snap", "known", "--remote", "model", "series="+series, "model="+model, "brand-id="+brand).CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to fetch model assertion: %v, Output: %s", err, string(output))
|
|
||||||
}
|
|
||||||
ioutil.WriteFile(model_assertion_path, output, 0644)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate account-key assertion if not exists
|
|
||||||
if _, err := os.Stat(account_key_assertion_path); os.IsNotExist(err) {
|
|
||||||
signKeySha3 := grep_pattern(model_assertion_path, "sign-key-sha3-384: ")
|
|
||||||
output, err := exec.Command("snap", "known", "--remote", "account-key", "public-key-sha3-384="+signKeySha3).CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to fetch account-key assertion: %v, Output: %s", err, string(output))
|
|
||||||
}
|
|
||||||
ioutil.WriteFile(account_key_assertion_path, output, 0644)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate account assertion if not exists
|
|
||||||
if _, err := os.Stat(account_assertion_path); os.IsNotExist(err) {
|
|
||||||
accountId := grep_pattern(account_key_assertion_path, "account-id: ")
|
|
||||||
output, err := exec.Command("snap", "known", "--remote", "account", "account-id="+accountId).CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to fetch account assertion: %v, Output: %s", err, string(output))
|
|
||||||
}
|
|
||||||
ioutil.WriteFile(account_assertion_path, output, 0644)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func grep_pattern(filePath, pattern string) string {
|
|
||||||
content, err := ioutil.ReadFile(filePath)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed to read from file %s: %v", filePath, err)
|
|
||||||
}
|
|
||||||
lines := strings.Split(string(content), "\n")
|
|
||||||
for _, line := range lines {
|
|
||||||
if strings.Contains(line, pattern) {
|
|
||||||
parts := strings.SplitN(line, ":", 2)
|
|
||||||
if len(parts) == 2 {
|
|
||||||
return strings.TrimSpace(parts[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Fatalf("Pattern %s not found in file %s", pattern, filePath)
|
|
||||||
return ""
|
|
||||||
}
|
|
15
debian/changelog
vendored
@ -1,18 +1,3 @@
|
|||||||
calamares-settings-ubuntu (1:25.10.2) questing; urgency=medium
|
|
||||||
|
|
||||||
* Revert the packageselect refactoring from Plucky, go back to the
|
|
||||||
known-good package customization implementation.
|
|
||||||
* Update everyone's installer branding text to say 25.10/questing.
|
|
||||||
* Update Lubuntu and Ubuntu Unity welcome images.
|
|
||||||
|
|
||||||
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Wed, 13 Aug 2025 12:45:11 -0500
|
|
||||||
|
|
||||||
calamares-settings-ubuntu (1:25.10.1) questing; urgency=medium
|
|
||||||
|
|
||||||
* Update Kubuntu branding for 25.10.
|
|
||||||
|
|
||||||
-- Rik Mills <rikmills@kde.org> Sun, 15 Jun 2025 12:56:18 +0100
|
|
||||||
|
|
||||||
calamares-settings-ubuntu (1:25.04.27) plucky; urgency=medium
|
calamares-settings-ubuntu (1:25.04.27) plucky; urgency=medium
|
||||||
|
|
||||||
* Disable virt-manager installation in third-party software options, as the
|
* Disable virt-manager installation in third-party software options, as the
|
||||||
|
5
debian/control
vendored
@ -7,11 +7,9 @@ Build-Depends: debhelper-compat (= 13),
|
|||||||
dh-sequence-qmldeps,
|
dh-sequence-qmldeps,
|
||||||
cmake,
|
cmake,
|
||||||
extra-cmake-modules,
|
extra-cmake-modules,
|
||||||
golang-github-snapcore-snapd-dev (>= 2.62),
|
|
||||||
golang-go,
|
|
||||||
golang-gopkg-yaml.v2-dev,
|
|
||||||
fakeroot,
|
fakeroot,
|
||||||
intltool,
|
intltool,
|
||||||
|
libapt-pkg-dev,
|
||||||
libcalamares-dev (>= 3.3.13-0ubuntu4),
|
libcalamares-dev (>= 3.3.13-0ubuntu4),
|
||||||
libkf6coreaddons-dev,
|
libkf6coreaddons-dev,
|
||||||
libqt6svg6-dev,
|
libqt6svg6-dev,
|
||||||
@ -79,6 +77,7 @@ Depends: calamares (>= 3.3.13-0ubuntu4),
|
|||||||
kdialog,
|
kdialog,
|
||||||
keyutils,
|
keyutils,
|
||||||
libglib2.0-bin,
|
libglib2.0-bin,
|
||||||
|
snapd-seed-glue,
|
||||||
squashfs-tools,
|
squashfs-tools,
|
||||||
sudo,
|
sudo,
|
||||||
${misc:Depends},
|
${misc:Depends},
|
||||||
|
11
debian/rules
vendored
@ -6,6 +6,7 @@ export GOPATH=/usr/share/gocode
|
|||||||
export GO111MODULE=off
|
export GO111MODULE=off
|
||||||
export GOCACHE=$(CURDIR)/.gocache
|
export GOCACHE=$(CURDIR)/.gocache
|
||||||
export PKGSELECT = "common/modules/pkgselect"
|
export PKGSELECT = "common/modules/pkgselect"
|
||||||
|
export PKGSELECTPROCESS = "common/modules/pkgselectprocess"
|
||||||
export USRDIR = "debian/calamares-settings-ubuntu-common/usr"
|
export USRDIR = "debian/calamares-settings-ubuntu-common/usr"
|
||||||
export DATA_USRDIR = "debian/calamares-settings-ubuntu-common-data/usr"
|
export DATA_USRDIR = "debian/calamares-settings-ubuntu-common-data/usr"
|
||||||
export MODULES_DIR = "debian/calamares-settings-ubuntu-common/usr/lib/$(DEB_HOST_MULTIARCH)/calamares/modules"
|
export MODULES_DIR = "debian/calamares-settings-ubuntu-common/usr/lib/$(DEB_HOST_MULTIARCH)/calamares/modules"
|
||||||
@ -18,11 +19,12 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
|
|||||||
|
|
||||||
override_dh_auto_configure:
|
override_dh_auto_configure:
|
||||||
(cd $(PKGSELECT) && mkdir build && cd build && cmake ..)
|
(cd $(PKGSELECT) && mkdir build && cd build && cmake ..)
|
||||||
|
(cd $(PKGSELECTPROCESS) && mkdir build && cd build && cmake ..)
|
||||||
|
|
||||||
override_dh_auto_build:
|
override_dh_auto_build:
|
||||||
make;
|
make;
|
||||||
(cd $(PKGSELECT)/build && $(MAKE))
|
(cd $(PKGSELECT)/build && $(MAKE))
|
||||||
(cd common/snap-seed-glue-emb && go build -gcflags="all=-N -l" -ldflags="-compressdwarf=false" -o snap-seed-glue-emb main.go)
|
(cd $(PKGSELECTPROCESS)/build && $(MAKE))
|
||||||
|
|
||||||
override_dh_auto_clean:
|
override_dh_auto_clean:
|
||||||
dh_auto_clean
|
dh_auto_clean
|
||||||
@ -41,8 +43,11 @@ override_dh_missing:
|
|||||||
chmod 644 $(DATA_MODULES_DIR)/automirror/module.desc
|
chmod 644 $(DATA_MODULES_DIR)/automirror/module.desc
|
||||||
chmod 644 $(MODULES_DIR)/pkgselect/libcalamares_viewmodule_pkgselect.so
|
chmod 644 $(MODULES_DIR)/pkgselect/libcalamares_viewmodule_pkgselect.so
|
||||||
chmod 644 $(MODULES_DIR)/pkgselect/module.desc
|
chmod 644 $(MODULES_DIR)/pkgselect/module.desc
|
||||||
mkdir -pv $(USRDIR)/bin/
|
mkdir -pv $(MODULES_DIR)/pkgselectprocess
|
||||||
cp -v common/snap-seed-glue-emb/snap-seed-glue-emb $(USRDIR)/bin/snap-seed-glue-emb
|
cp -v $(PKGSELECTPROCESS)/build/*.so $(PKGSELECTPROCESS)/build/*.desc $(MODULES_DIR)/pkgselectprocess
|
||||||
|
chmod 644 $(MODULES_DIR)/pkgselectprocess/libcalamares_job_pkgselectprocess.so
|
||||||
|
chmod 644 $(MODULES_DIR)/pkgselectprocess/module.desc
|
||||||
mkdir -pv $(USRDIR)/libexec/ $(DATA_USRDIR)/libexec/
|
mkdir -pv $(USRDIR)/libexec/ $(DATA_USRDIR)/libexec/
|
||||||
cp -v common/fixconkeys-part1 $(DATA_USRDIR)/libexec/fixconkeys-part1
|
cp -v common/fixconkeys-part1 $(DATA_USRDIR)/libexec/fixconkeys-part1
|
||||||
cp -v common/fixconkeys-part2 $(DATA_USRDIR)/libexec/fixconkeys-part2
|
cp -v common/fixconkeys-part2 $(DATA_USRDIR)/libexec/fixconkeys-part2
|
||||||
|
cp -v $(PKGSELECTPROCESS)/build/check_package $(USRDIR)/libexec/checkpackage-backend
|
||||||
|
@ -6,10 +6,10 @@ windowExpanding: fullscreen
|
|||||||
strings:
|
strings:
|
||||||
productName: Kubuntu
|
productName: Kubuntu
|
||||||
shortProductName: Kubuntu
|
shortProductName: Kubuntu
|
||||||
version: 25.10
|
version: 25.04
|
||||||
shortVersion: questing
|
shortVersion: plucky
|
||||||
versionedName: Kubuntu
|
versionedName: Kubuntu
|
||||||
shortVersionedName: Kubuntu 25.10
|
shortVersionedName: Kubuntu 25.04
|
||||||
bootloaderEntryName: Kubuntu
|
bootloaderEntryName: Kubuntu
|
||||||
productUrl: https://kubuntu.org/
|
productUrl: https://kubuntu.org/
|
||||||
supportUrl: https://kubuntu.org/contact/
|
supportUrl: https://kubuntu.org/contact/
|
||||||
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 72 KiB |
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Version=1.0
|
Version=1.0
|
||||||
_Name=Install Kubuntu 25.10
|
_Name=Install Kubuntu 25.04
|
||||||
_GenericName=Install Kubuntu
|
_GenericName=Install Kubuntu
|
||||||
Exec=sudo -E /usr/bin/calamares-launch-normal
|
Exec=sudo -E /usr/bin/calamares-launch-normal
|
||||||
_Comment=Calamares — System Installer
|
_Comment=Calamares — System Installer
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
batch-identifier: kubuntu-2510-${DATE}
|
batch-identifier: kubuntu-2504-${DATE}
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
update_db: true
|
|
||||||
backend: apt
|
|
||||||
operations:
|
|
||||||
- remove:
|
|
||||||
- "^live-*"
|
|
||||||
- calamares-settings-kubuntu
|
|
||||||
- calamares
|
|
||||||
- cifs-utils
|
|
||||||
- kubuntu-installer-prompt
|
|
||||||
- try_install:
|
|
||||||
- language-pack-$LOCALE
|
|
||||||
- language-pack-gnome-$LOCALE
|
|
||||||
- language-pack-kde-$LOCALE
|
|
||||||
- hunspell-$LOCALE
|
|
||||||
- libreoffice-help-$LOCALE
|
|
||||||
- libreoffice-l10n-$LOCALE
|
|
@ -15,7 +15,7 @@ partitionLayout:
|
|||||||
onlyPresentWithEncryption: true
|
onlyPresentWithEncryption: true
|
||||||
mountPoint: "/boot"
|
mountPoint: "/boot"
|
||||||
size: 4G
|
size: 4G
|
||||||
- name: "kubuntu_2510"
|
- name: "kubuntu_2504"
|
||||||
filesystem: unknown
|
filesystem: unknown
|
||||||
mountPoint: "/"
|
mountPoint: "/"
|
||||||
size: 100%
|
size: 100%
|
||||||
|
57
kubuntu/modules/pkgselect.conf
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
additional_packages:
|
||||||
|
- id: "element-desktop"
|
||||||
|
name: "Element"
|
||||||
|
description: "Matrix-based end-to-end encrypted messenger and secure collaboration app."
|
||||||
|
snap: true
|
||||||
|
- id: "krita"
|
||||||
|
name: "Krita"
|
||||||
|
description: "Graphics editor designed primarily for digital art and 2D animation."
|
||||||
|
snap: true
|
||||||
|
minimal_remove_packages:
|
||||||
|
- kmahjongg
|
||||||
|
- kmines
|
||||||
|
- kpat
|
||||||
|
- ksudoku
|
||||||
|
- skanlite
|
||||||
|
- skanpage
|
||||||
|
- okular
|
||||||
|
- "libreoffice*"
|
||||||
|
- kdeconnect
|
||||||
|
- krdc
|
||||||
|
- konversation
|
||||||
|
- neochat
|
||||||
|
- elisa
|
||||||
|
- haruna
|
||||||
|
- vim
|
||||||
|
- snapd
|
||||||
|
- partitionmanager
|
||||||
|
- usb-creator*
|
||||||
|
- plasma-welcome
|
||||||
|
- kde-config-tablet
|
||||||
|
installer_remove_packages:
|
||||||
|
- "^live-*"
|
||||||
|
- calamares-settings-kubuntu
|
||||||
|
- calamares
|
||||||
|
- cifs-utils
|
||||||
|
- fcitx5
|
||||||
|
- fcitx5-frontend-all
|
||||||
|
- fcitx5-table
|
||||||
|
- fcitx5-pinyin
|
||||||
|
- fcitx5-module-cloudpinyin
|
||||||
|
- fcitx5-material-color
|
||||||
|
- fcitx5-chinese-addons
|
||||||
|
- kde-config-fcitx5
|
||||||
|
- kubuntu-installer-prompt
|
||||||
|
regular_install_packages:
|
||||||
|
- language-pack-$LOCALE
|
||||||
|
- language-pack-gnome-$LOCALE
|
||||||
|
- language-pack-kde-$LOCALE
|
||||||
|
- hunspell-$LOCALE
|
||||||
|
- libreoffice-help-$LOCALE
|
||||||
|
- libreoffice-l10n-$LOCALE
|
||||||
|
refresh_snaps:
|
||||||
|
- "firefox"
|
||||||
|
- "thunderbird"
|
||||||
|
- "firmware-updater"
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: false
|
|
||||||
timeout: 10800
|
|
||||||
"packages.minimalButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y --purge remove kmahjongg kmines kpat ksudoku skanlite skanpage okular libreoffice* kdeconnect krdc konversation neochat elisa haruna vim snapd partitionmanager usb-creator* plasma-welcome kde-config-tablet plasma-welcome"
|
|
||||||
- "apt-get -y autoremove"
|
|
||||||
"packages.partyButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y install ubuntu-restricted-addons unrar"
|
|
||||||
"packages.updatesButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::='--force-confnew' full-upgrade"
|
|
||||||
"packages.virtmanagerButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y install virt-manager"
|
|
@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: true
|
|
||||||
timeout: 10800
|
|
||||||
"packages.elementButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed element-desktop"
|
|
||||||
"packages.kritaButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed krita"
|
|
||||||
"packages.thunderbirdButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed thunderbird"
|
|
@ -29,7 +29,7 @@ if kdialog --warningyesno "${msg}"; then
|
|||||||
sed -i "/- welcome$/a \ \ - oemid" /etc/calamares/settings.conf;
|
sed -i "/- welcome$/a \ \ - oemid" /etc/calamares/settings.conf;
|
||||||
|
|
||||||
# Enable OEM prep module
|
# Enable OEM prep module
|
||||||
sed -i "/- packages$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
|
sed -i "/- pkgselectprocess$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
|
||||||
|
|
||||||
# Fix OEM UID
|
# Fix OEM UID
|
||||||
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
|
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Version=1.0
|
Version=1.0
|
||||||
Name=Install Kubuntu 25.10 (OEM mode)
|
Name=Install Kubuntu 25.04 (OEM mode)
|
||||||
Exec=sudo -E /usr/bin/calamares-launch-oem
|
Exec=sudo -E /usr/bin/calamares-launch-oem
|
||||||
Icon=system-software-install
|
Icon=system-software-install
|
||||||
Terminal=false
|
Terminal=false
|
||||||
|
@ -16,8 +16,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "تثبيت كوبونتو 25.10"
|
msgstr "تثبيت كوبونتو 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Instal·lar Kubuntu 25.10"
|
msgstr "Instal·lar Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Installer Kubuntu 25.10"
|
msgstr "Installer Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Kubuntu 25.10 installieren"
|
msgstr "Kubuntu 25.04 installieren"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Instalar Kubuntu 25.10"
|
msgstr "Instalar Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Installer Kubuntu 25.10"
|
msgstr "Installer Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -20,8 +20,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Installa Kubuntu 25.10"
|
msgstr "Installa Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Installer Kubuntu 25.10"
|
msgstr "Installer Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -16,8 +16,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Zainstaluj Kubuntu 25.10"
|
msgstr "Zainstaluj Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Instalar o Kubuntu 25.10"
|
msgstr "Instalar o Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr "Instalar Kubuntu 25.10"
|
msgstr "Instalar Kubuntu 25.04"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Kubuntu"
|
msgid "Install Kubuntu"
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:1
|
#: ../kubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Kubuntu 25.10"
|
msgid "Install Kubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../kubuntu-calamares.desktop.in.h:2
|
#: ../kubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
modules-search: [ local ]
|
modules-search: [ local ]
|
||||||
|
|
||||||
instances:
|
instances:
|
||||||
- id: before_bootloader_mkdirs
|
|
||||||
module: contextualprocess
|
|
||||||
config: before_bootloader_mkdirs_context.conf
|
|
||||||
- id: before_bootloader
|
- id: before_bootloader
|
||||||
module: contextualprocess
|
module: contextualprocess
|
||||||
config: before_bootloader_context.conf
|
config: before_bootloader_context.conf
|
||||||
|
- id: copy_vmlinuz_shellprocess
|
||||||
|
module: shellprocess
|
||||||
|
config: copy_vmlinuz_shellprocess.conf
|
||||||
- id: logs
|
- id: logs
|
||||||
module: shellprocess
|
module: shellprocess
|
||||||
config: shellprocess_logs.conf
|
config: shellprocess_logs.conf
|
||||||
@ -17,12 +17,6 @@ instances:
|
|||||||
- id: add386arch
|
- id: add386arch
|
||||||
module: shellprocess
|
module: shellprocess
|
||||||
config: shellprocess_add386arch.conf
|
config: shellprocess_add386arch.conf
|
||||||
- id: pkgselect_action
|
|
||||||
module: contextualprocess
|
|
||||||
config: pkgselect_context.conf
|
|
||||||
- id: pkgselect_snap_action
|
|
||||||
module: contextualprocess
|
|
||||||
config: pkgselect_snap_context.conf
|
|
||||||
- id: oemprep
|
- id: oemprep
|
||||||
module: shellprocess
|
module: shellprocess
|
||||||
config: shellprocess_oemprep.conf
|
config: shellprocess_oemprep.conf
|
||||||
@ -59,7 +53,7 @@ sequence:
|
|||||||
- displaymanager
|
- displaymanager
|
||||||
- networkcfg
|
- networkcfg
|
||||||
- hwclock
|
- hwclock
|
||||||
- contextualprocess@before_bootloader_mkdirs
|
- shellprocess@copy_vmlinuz_shellprocess
|
||||||
- shellprocess@bug-LP#1829805
|
- shellprocess@bug-LP#1829805
|
||||||
- shellprocess@fixconkeys_part1
|
- shellprocess@fixconkeys_part1
|
||||||
- shellprocess@fixconkeys_part2
|
- shellprocess@fixconkeys_part2
|
||||||
@ -70,9 +64,7 @@ sequence:
|
|||||||
- bootloader
|
- bootloader
|
||||||
- shellprocess@add386arch
|
- shellprocess@add386arch
|
||||||
- automirror
|
- automirror
|
||||||
- packages
|
- pkgselectprocess
|
||||||
- contextualprocess@pkgselect_action
|
|
||||||
- contextualprocess@pkgselect_snap_action
|
|
||||||
- shellprocess@logs
|
- shellprocess@logs
|
||||||
- umount
|
- umount
|
||||||
- show:
|
- show:
|
||||||
|
@ -6,10 +6,10 @@ windowExpanding: fullscreen
|
|||||||
strings:
|
strings:
|
||||||
productName: Lubuntu
|
productName: Lubuntu
|
||||||
shortProductName: Lubuntu
|
shortProductName: Lubuntu
|
||||||
version: 25.10
|
version: 25.04
|
||||||
shortVersion: questing
|
shortVersion: plucky
|
||||||
versionedName: Lubuntu
|
versionedName: Lubuntu
|
||||||
shortVersionedName: Lubuntu 25.10
|
shortVersionedName: Lubuntu 25.04
|
||||||
bootloaderEntryName: Ubuntu
|
bootloaderEntryName: Ubuntu
|
||||||
productUrl: https://lubuntu.me/
|
productUrl: https://lubuntu.me/
|
||||||
supportUrl: https://lubuntu.me/links/
|
supportUrl: https://lubuntu.me/links/
|
||||||
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 24 KiB |
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Version=1.0
|
Version=1.0
|
||||||
_Name=Install Lubuntu 25.10
|
_Name=Install Lubuntu 25.04
|
||||||
_GenericName=Install Lubuntu
|
_GenericName=Install Lubuntu
|
||||||
Exec=sudo -E /usr/bin/calamares-launch-normal
|
Exec=sudo -E /usr/bin/calamares-launch-normal
|
||||||
_Comment=Calamares — System Installer
|
_Comment=Calamares — System Installer
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
batch-identifier: lubuntu-2510-${DATE}
|
batch-identifier: lubuntu-2504-${DATE}
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
update_db: true
|
|
||||||
backend: apt
|
|
||||||
operations:
|
|
||||||
- remove:
|
|
||||||
- "^live-*"
|
|
||||||
- calamares-settings-lubuntu
|
|
||||||
- calamares
|
|
||||||
- zram-config
|
|
||||||
- cifs-utils
|
|
||||||
- lubuntu-installer-prompt
|
|
||||||
- try_install:
|
|
||||||
- language-pack-$LOCALE
|
|
||||||
- language-pack-gnome-$LOCALE
|
|
||||||
- language-pack-kde-$LOCALE
|
|
||||||
- hunspell-$LOCALE
|
|
||||||
- libreoffice-help-$LOCALE
|
|
||||||
- libreoffice-l10n-$LOCALE
|
|
@ -15,7 +15,7 @@ partitionLayout:
|
|||||||
onlyPresentWithEncryption: true
|
onlyPresentWithEncryption: true
|
||||||
mountPoint: "/boot"
|
mountPoint: "/boot"
|
||||||
size: 4G
|
size: 4G
|
||||||
- name: "lubuntu_2510"
|
- name: "lubuntu_2504"
|
||||||
filesystem: unknown
|
filesystem: unknown
|
||||||
mountPoint: "/"
|
mountPoint: "/"
|
||||||
size: 100%
|
size: 100%
|
||||||
|
26
lubuntu/modules/pkgselect.conf
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
stacked_squashfs: true
|
||||||
|
packages:
|
||||||
|
additional_packages:
|
||||||
|
- id: "element-desktop"
|
||||||
|
name: "Element"
|
||||||
|
description: "Matrix-based end-to-end encrypted messenger and secure collaboration app."
|
||||||
|
snap: true
|
||||||
|
- id: "thunderbird"
|
||||||
|
name: "Thunderbird"
|
||||||
|
description: "Email, newsfeed, chat, and calendaring client."
|
||||||
|
snap: true
|
||||||
|
- id: "krita"
|
||||||
|
name: "Krita"
|
||||||
|
description: "Graphics editor designed primarily for digital art and 2D animation."
|
||||||
|
snap: true
|
||||||
|
regular_install_packages:
|
||||||
|
- language-pack-$LOCALE
|
||||||
|
- language-pack-gnome-$LOCALE
|
||||||
|
- language-pack-kde-$LOCALE
|
||||||
|
- hunspell-$LOCALE
|
||||||
|
- libreoffice-help-$LOCALE
|
||||||
|
- libreoffice-l10n-$LOCALE
|
||||||
|
refresh_snaps:
|
||||||
|
- "firefox"
|
||||||
|
- "firmware-updater"
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: false
|
|
||||||
timeout: 10800
|
|
||||||
"packages.minimalButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y --purge remove snapd lubuntu-snap-installation-monitor vlc plasma-discover transmission-qt quassel 2048-qt featherpad noblenote kcalc qps zsync partitionmanager qapt-deb-installer picom qlipper qtpass libreoffice*"
|
|
||||||
- "apt-get -y autoremove"
|
|
||||||
"packages.partyButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y install ubuntu-restricted-addons unrar"
|
|
||||||
"packages.updatesButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::='--force-confnew' full-upgrade"
|
|
||||||
"packages.virtmanagerButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y install virt-manager"
|
|
@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: true
|
|
||||||
timeout: 10800
|
|
||||||
"packages.elementButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed element-desktop"
|
|
||||||
"packages.kritaButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed krita"
|
|
||||||
"packages.thunderbirdButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed thunderbird"
|
|
@ -29,7 +29,7 @@ if kdialog --warningyesno "${msg}"; then
|
|||||||
sed -i "/- welcome$/a \ \ - oemid" /etc/calamares/settings.conf;
|
sed -i "/- welcome$/a \ \ - oemid" /etc/calamares/settings.conf;
|
||||||
|
|
||||||
# Enable OEM prep module
|
# Enable OEM prep module
|
||||||
sed -i "/- packages$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
|
sed -i "/- pkgselectprocess$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
|
||||||
|
|
||||||
# Fix OEM UID
|
# Fix OEM UID
|
||||||
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
|
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Version=1.0
|
Version=1.0
|
||||||
Name=Install Lubuntu 25.10 (OEM mode)
|
Name=Install Lubuntu 25.04 (OEM mode)
|
||||||
Exec=sudo -E /usr/bin/calamares-launch-oem
|
Exec=sudo -E /usr/bin/calamares-launch-oem
|
||||||
Icon=system-software-install
|
Icon=system-software-install
|
||||||
Terminal=false
|
Terminal=false
|
||||||
|
@ -16,8 +16,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "تنصيب لوبينتو 25.10"
|
msgstr "تنصيب لوبينتو 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Instal·lar Lubuntu 25.10"
|
msgstr "Instal·lar Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Installer Lubuntu 25.10"
|
msgstr "Installer Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Lubuntu 25.10 installieren"
|
msgstr "Lubuntu 25.04 installieren"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Instalar Lubuntu 25.10"
|
msgstr "Instalar Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Installer Lubuntu 25.10"
|
msgstr "Installer Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -20,8 +20,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Installa Lubuntu 25.10"
|
msgstr "Installa Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Installer Lubuntu 25.10"
|
msgstr "Installer Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -16,8 +16,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Zainstaluj Lubuntu 25.10"
|
msgstr "Zainstaluj Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Instalar o Lubuntu 25.10"
|
msgstr "Instalar o Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr "Instalar Lubuntu 25.10"
|
msgstr "Instalar Lubuntu 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Lubuntu"
|
msgid "Install Lubuntu"
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Lubuntu 25.10"
|
msgid "Install Lubuntu 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
modules-search: [ local ]
|
modules-search: [ local ]
|
||||||
|
|
||||||
instances:
|
instances:
|
||||||
- id: before_bootloader_mkdirs
|
|
||||||
module: contextualprocess
|
|
||||||
config: before_bootloader_mkdirs_context.conf
|
|
||||||
- id: before_bootloader
|
- id: before_bootloader
|
||||||
module: contextualprocess
|
module: contextualprocess
|
||||||
config: before_bootloader_context.conf
|
config: before_bootloader_context.conf
|
||||||
|
- id: copy_vmlinuz_shellprocess
|
||||||
|
module: shellprocess
|
||||||
|
config: copy_vmlinuz_shellprocess.conf
|
||||||
- id: logs
|
- id: logs
|
||||||
module: shellprocess
|
module: shellprocess
|
||||||
config: shellprocess_logs.conf
|
config: shellprocess_logs.conf
|
||||||
@ -17,12 +17,6 @@ instances:
|
|||||||
- id: add386arch
|
- id: add386arch
|
||||||
module: shellprocess
|
module: shellprocess
|
||||||
config: shellprocess_add386arch.conf
|
config: shellprocess_add386arch.conf
|
||||||
- id: pkgselect_action
|
|
||||||
module: contextualprocess
|
|
||||||
config: pkgselect_context.conf
|
|
||||||
- id: pkgselect_snap_action
|
|
||||||
module: contextualprocess
|
|
||||||
config: pkgselect_snap_context.conf
|
|
||||||
- id: oemprep
|
- id: oemprep
|
||||||
module: shellprocess
|
module: shellprocess
|
||||||
config: shellprocess_oemprep.conf
|
config: shellprocess_oemprep.conf
|
||||||
@ -59,20 +53,18 @@ sequence:
|
|||||||
- displaymanager
|
- displaymanager
|
||||||
- networkcfg
|
- networkcfg
|
||||||
- hwclock
|
- hwclock
|
||||||
- contextualprocess@before_bootloader_mkdirs
|
|
||||||
- automirror
|
- automirror
|
||||||
- shellprocess@fixconkeys_part1
|
- pkgselectprocess
|
||||||
- shellprocess@fixconkeys_part2
|
|
||||||
- dracutlukscfg
|
- dracutlukscfg
|
||||||
- dracut
|
- dracut
|
||||||
|
- shellprocess@copy_vmlinuz_shellprocess
|
||||||
- shellprocess@bug-LP#1829805
|
- shellprocess@bug-LP#1829805
|
||||||
|
- shellprocess@fixconkeys_part1
|
||||||
|
- shellprocess@fixconkeys_part2
|
||||||
- shellprocess@add386arch
|
- shellprocess@add386arch
|
||||||
- contextualprocess@before_bootloader
|
- contextualprocess@before_bootloader
|
||||||
- grubcfg
|
- grubcfg
|
||||||
- bootloader
|
- bootloader
|
||||||
- packages
|
|
||||||
- contextualprocess@pkgselect_action
|
|
||||||
- contextualprocess@pkgselect_snap_action
|
|
||||||
- shellprocess@logs
|
- shellprocess@logs
|
||||||
- umount
|
- umount
|
||||||
- show:
|
- show:
|
||||||
|
@ -6,10 +6,10 @@ windowExpanding: fullscreen
|
|||||||
strings:
|
strings:
|
||||||
productName: Ubuntu Unity
|
productName: Ubuntu Unity
|
||||||
shortProductName: Ubuntu Unity
|
shortProductName: Ubuntu Unity
|
||||||
version: 25.10
|
version: 25.04
|
||||||
shortVersion: questing
|
shortVersion: plucky
|
||||||
versionedName: Ubuntu Unity
|
versionedName: Ubuntu Unity
|
||||||
shortVersionedName: Ubuntu Unity 25.10
|
shortVersionedName: Ubuntu Unity 25.04
|
||||||
bootloaderEntryName: Ubuntu
|
bootloaderEntryName: Ubuntu
|
||||||
productUrl: https://ubuntuunity.org/
|
productUrl: https://ubuntuunity.org/
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 19 KiB |
@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
batch-identifier: ubuntuunity-2510-${DATE}
|
batch-identifier: ubuntuunity-2504-${DATE}
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
update_db: true
|
|
||||||
backend: apt
|
|
||||||
operations:
|
|
||||||
- remove:
|
|
||||||
- "^live-*"
|
|
||||||
- calamares-settings-ubuntu-unity
|
|
||||||
- calamares
|
|
||||||
- cifs-utils
|
|
||||||
- try_install:
|
|
||||||
- language-pack-$LOCALE
|
|
||||||
- language-pack-gnome-$LOCALE
|
|
||||||
- language-pack-kde-$LOCALE
|
|
||||||
- hunspell-$LOCALE
|
|
||||||
- libreoffice-help-$LOCALE
|
|
||||||
- libreoffice-l10n-$LOCALE
|
|
@ -15,7 +15,7 @@ partitionLayout:
|
|||||||
onlyPresentWithEncryption: true
|
onlyPresentWithEncryption: true
|
||||||
mountPoint: "/boot"
|
mountPoint: "/boot"
|
||||||
size: 4G
|
size: 4G
|
||||||
- name: "ubuntu_unity_2510"
|
- name: "ubuntu_unity_2504"
|
||||||
filesystem: unknown
|
filesystem: unknown
|
||||||
mountPoint: "/"
|
mountPoint: "/"
|
||||||
size: 100%
|
size: 100%
|
||||||
|
48
ubuntuunity/modules/pkgselect.conf
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
packages:
|
||||||
|
additional_packages:
|
||||||
|
- id: "element-desktop"
|
||||||
|
name: "Element"
|
||||||
|
description: "Matrix-based end-to-end encrypted messenger and secure collaboration app."
|
||||||
|
snap: true
|
||||||
|
- id: "thunderbird"
|
||||||
|
name: "Thunderbird"
|
||||||
|
description: "Email, newsfeed, chat, and calendaring client."
|
||||||
|
snap: true
|
||||||
|
- id: "krita"
|
||||||
|
name: "Krita"
|
||||||
|
description: "Graphics editor designed primarily for digital art and 2D animation."
|
||||||
|
snap: true
|
||||||
|
minimal_remove_packages:
|
||||||
|
- snapd aisleriot
|
||||||
|
- atril
|
||||||
|
- cheese
|
||||||
|
- simple-scan
|
||||||
|
- gdebi
|
||||||
|
- gparted
|
||||||
|
- "*kvantum*"
|
||||||
|
- "libreoffice*"
|
||||||
|
- gnome-mahjongg
|
||||||
|
- gnome-mines
|
||||||
|
- remmina
|
||||||
|
- rhythmbox
|
||||||
|
- shotwell
|
||||||
|
- gnome-sudoku
|
||||||
|
- synaptic
|
||||||
|
- transmission-gtk
|
||||||
|
- vlc
|
||||||
|
- stacer
|
||||||
|
installer_remove_packages:
|
||||||
|
- "^live-*"
|
||||||
|
- calamares-settings-ubuntu-unity
|
||||||
|
- calamares
|
||||||
|
- cifs-utils
|
||||||
|
regular_install_packages:
|
||||||
|
- language-pack-$LOCALE
|
||||||
|
- language-pack-gnome-$LOCALE
|
||||||
|
- language-pack-kde-$LOCALE
|
||||||
|
- hunspell-$LOCALE
|
||||||
|
- libreoffice-help-$LOCALE
|
||||||
|
- libreoffice-l10n-$LOCALE
|
||||||
|
refresh_snaps:
|
||||||
|
- "firefox"
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: false
|
|
||||||
timeout: 10800
|
|
||||||
"packages.minimalButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y --purge remove snapd aisleriot atril cheese simple-scan gdebi gparted *kvantum* libreoffice* gnome-mahjongg gnome-mines remmina rhythmbox shotwell gnome-sudoku synaptic transmission-gtk vlc stacer"
|
|
||||||
- "apt-get -y autoremove"
|
|
||||||
"packages.partyButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y install ubuntu-restricted-addons unrar"
|
|
||||||
"packages.updatesButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::='--force-confnew' full-upgrade"
|
|
||||||
"packages.virtmanagerButton":
|
|
||||||
true:
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get update"
|
|
||||||
- "DEBIAN_FRONTEND=noninteractive apt-get -y install virt-manager"
|
|
@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
dontChroot: true
|
|
||||||
timeout: 10800
|
|
||||||
"packages.elementButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed element-desktop"
|
|
||||||
"packages.kritaButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed krita"
|
|
||||||
"packages.thunderbirdButton":
|
|
||||||
true: "snap-seed-glue-emb --seed ${ROOT}/var/lib/snapd/seed thunderbird"
|
|
@ -26,7 +26,7 @@ if zenity --question --text="${msg}"; then
|
|||||||
sed -i "/- welcome$/a \ \ - oemid" /etc/calamares/settings.conf;
|
sed -i "/- welcome$/a \ \ - oemid" /etc/calamares/settings.conf;
|
||||||
|
|
||||||
# Enable OEM prep module
|
# Enable OEM prep module
|
||||||
sed -i "/- packages$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
|
sed -i "/- pkgselectprocess$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
|
||||||
|
|
||||||
# Fix OEM UID
|
# Fix OEM UID
|
||||||
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
|
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Version=1.0
|
Version=1.0
|
||||||
Name=Install Ubuntu Unity 25.10 (OEM mode)
|
Name=Install Ubuntu Unity 25.04 (OEM mode)
|
||||||
Exec=sudo -E /usr/bin/calamares-launch-oem
|
Exec=sudo -E /usr/bin/calamares-launch-oem
|
||||||
Icon=ubuntu-unity-installer
|
Icon=ubuntu-unity-installer
|
||||||
Terminal=false
|
Terminal=false
|
||||||
|
@ -16,7 +16,7 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr "Instal·lar Ubuntu Unity 25.10"
|
msgstr "Instal·lar Ubuntu Unity 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Ubuntu Unity"
|
msgid "Install Ubuntu Unity"
|
||||||
|
@ -18,7 +18,7 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../ubuntu-unity-calamares.desktop.in.h:1
|
#: ../ubuntu-unity-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../ubuntu-unity-calamares.desktop.in.h:2
|
#: ../ubuntu-unity-calamares.desktop.in.h:2
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr "Installer Ubuntu Unity 25.10"
|
msgstr "Installer Ubuntu Unity 25.04"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Ubuntu Unity"
|
msgid "Install Ubuntu Unity"
|
||||||
|
@ -15,8 +15,8 @@ msgstr ""
|
|||||||
"X-Generator: Weblate 3.1-dev\n"
|
"X-Generator: Weblate 3.1-dev\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr "Ubuntu Unity 25.10 installieren"
|
msgstr "Ubuntu Unity 25.04 installieren"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
msgid "Install Ubuntu Unity"
|
msgid "Install Ubuntu Unity"
|
||||||
|
@ -13,7 +13,7 @@ msgstr ""
|
|||||||
"X-Generator: Translate Toolkit 2.3.0\n"
|
"X-Generator: Translate Toolkit 2.3.0\n"
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:1
|
#: ../lubuntu-calamares.desktop.in.h:1
|
||||||
msgid "Install Ubuntu Unity 25.10"
|
msgid "Install Ubuntu Unity 25.04"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../lubuntu-calamares.desktop.in.h:2
|
#: ../lubuntu-calamares.desktop.in.h:2
|
||||||
|