Compare commits

..

No commits in common. "ubuntu/plucky" and "ubuntu/1%24.04.34" have entirely different histories.

155 changed files with 1445 additions and 2275 deletions

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.5)
project(basicwallpaper VERSION 0.1 LANGUAGES CXX) project(basicwallpaper VERSION 0.1 LANGUAGES CXX)

View File

@ -0,0 +1,288 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 6.0.2, 2024-02-14T12:14:09. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{c72e8e96-4d64-44b5-94c8-e16820d11b4b}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{c8b6ccbc-b12c-473e-83be-23a4b6d2eb6e}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="CMake.Build.Type">Debug</value>
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
-DCMAKE_BUILD_TYPE:STRING=Debug
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/arraybolt3/Projects/build-basicwallpaper-Desktop-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="CMake.Build.Type">Release</value>
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/arraybolt3/Projects/build-basicwallpaper-Desktop-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/arraybolt3/Projects/build-basicwallpaper-Desktop-RelWithDebInfo</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
-DCMAKE_BUILD_TYPE:STRING=MinSizeRel
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/arraybolt3/Projects/build-basicwallpaper-Desktop-MinSizeRel</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -1,4 +1,5 @@
#!/bin/bash #!/bin/bash
loadkeys "$(cat /dev/shm/fixconkeys-layout)" loadkeys "$(cat /dev/shm/fixconkeys-layout)"
setupcon --save-only setupcon --save-only
update-initramfs -c -k all
rm /usr/libexec/fixconkeys-part2 rm /usr/libexec/fixconkeys-part2

View File

@ -11,8 +11,8 @@ firmwareType:
- command: sed -i '/deb http/d' /etc/apt/sources.list - command: sed -i '/deb http/d' /etc/apt/sources.list
timeout: 10 timeout: 10
- command: apt-get update - command: apt-get update
timeout: 10800 timeout: 120
- command: apt install -y --no-upgrade -o Acquire::gpgv::Options::=--ignore-time-conflict grub-efi-$(if grep -q 64 /sys/firmware/efi/fw_platform_size; then echo amd64-signed; else echo ia32; fi) - command: apt install -y --no-upgrade -o Acquire::gpgv::Options::=--ignore-time-conflict grub-efi-$(if grep -q 64 /sys/firmware/efi/fw_platform_size; then echo amd64-signed; else echo ia32; fi)
timeout: 10800 timeout: 300
- command: apt install -y --no-upgrade -o Acquire::gpgv::Options::=--ignore-time-conflict shim-signed - command: apt install -y --no-upgrade -o Acquire::gpgv::Options::=--ignore-time-conflict shim-signed
timeout: 10800 timeout: 300

View File

@ -0,0 +1,10 @@
---
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)

View File

@ -1,5 +0,0 @@
---
dontChroot: true
timeout: 60
script:
- command: "cp /cdrom/casper/vmlinuz ${ROOT}/boot/vmlinuz-$(uname -r)"

View File

@ -21,9 +21,6 @@ extraMounts:
- device: /run/systemd/resolve - device: /run/systemd/resolve
mountPoint: /run/systemd/resolve mountPoint: /run/systemd/resolve
options: [ bind ] options: [ bind ]
- device: /cdrom
mountPoint: /media/cdrom
options: [ bind ]
mountOptions: mountOptions:
- filesystem: default - filesystem: default

View File

@ -5,12 +5,12 @@ include(FeatureSummary)
set( CMAKE_CXX_STANDARD 17 ) set( CMAKE_CXX_STANDARD 17 )
set( CMAKE_CXX_STANDARD_REQUIRED ON ) set( CMAKE_CXX_STANDARD_REQUIRED ON )
set( CALAMARES_VERSION_REQUIRED 3.3.9 ) set( CALAMARES_VERSION_REQUIRED 3.3.0 )
find_package(ECM "6.0.0" NO_MODULE) find_package(ECM ${ECM_VERSION} NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH}) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})
include(KDEInstallDirs) include(KDEInstallDirs)
find_package(KF6 REQUIRED COMPONENTS CoreAddons) find_package(KF5 REQUIRED COMPONENTS CoreAddons)
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} NO_CMAKE_PACKAGE_REGISTRY) find_package(Calamares ${CALAMARES_VERSION_REQUIRED} NO_CMAKE_PACKAGE_REGISTRY)
if (NOT TARGET Calamares::calamares OR NOT TARGET Calamares::calamaresui) if (NOT TARGET Calamares::calamares OR NOT TARGET Calamares::calamaresui)
find_package(Calamares ${CALAMARES_VERSION_REQUIRED} REQUIRED) find_package(Calamares ${CALAMARES_VERSION_REQUIRED} REQUIRED)

View File

@ -1,59 +1,38 @@
#include "PackageSelectViewStep.h" #include "PackageSelectViewStep.h"
#include "ui_pkgselect.h"
#include "JobQueue.h" #include "JobQueue.h"
#include "GlobalStorage.h" #include "GlobalStorage.h"
#include "network/Manager.h" #include "network/Manager.h"
#include <QCheckBox> #include <QVariantMap>
#include <QVariant>
#include <QDebug>
#include <QLabel>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QRadioButton>
/** PackageSelectViewStep::PackageSelectViewStep( QObject* parent )
* @brief Initializes a new PackageSelectViewStep object. : Calamares::ViewStep( parent ),
* @param parent The parent QObject. m_packageSelections(QVariantMap()),
*/ 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 PackageSelectViewStep::prettyName() const QString
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.value(key).toBool(); return m_packageSelections.contains(key) && m_packageSelections[key].toBool() == true;
} }
QWidget* PackageSelectViewStep::widget() QWidget* PackageSelectViewStep::widget()
{ {
return m_widget; return m_widget;
} }
@ -82,26 +61,71 @@ 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()
{ {
// Check network availability // Connect the Minimal Installation radio button
Calamares::Network::Manager network; connect(ui->minimal_button, &QRadioButton::toggled, this, [this](bool checked) {
bool hasInternet = network.hasInternet(); Calamares::Network::Manager network;
if (checked && network.hasInternet()) {
ui->extraparty_scroll->setVisible(false);
ui->extraparty_text->setVisible(false);
ui->mandatory_warning_label->setVisible(false);
// Handle network unavailability ui->element_button->setChecked(false);
//if (!hasInternet) { ui->thunderbird_button->setChecked(false);
// Disable almost all fancy features to avoid bugs, revert in 25.10 cycle ui->virtmanager_button->setChecked(false);
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);
@ -115,277 +139,59 @@ 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);
//}
// Dynamically create package checkboxes only once ui->element_button->setChecked(false);
if (m_packageCheckBoxes.isEmpty()) { ui->thunderbird_button->setChecked(false);
QVariantList additionalPackages = m_configurationMap.value("packages").toMap().value("additional_packages").toList(); ui->virtmanager_button->setChecked(false);
QVBoxLayout* packagesLayout = ui->extraparty_scrollhouse->findChild<QVBoxLayout*>("packages_layout"); ui->krita_button->setChecked(false);
if (!packagesLayout) {
qWarning() << "packages_layout not found in UI.";
return;
}
for (const QVariant& var : additionalPackages) { ui->element_button->setEnabled(false);
QVariantMap pkg = var.toMap(); ui->thunderbird_button->setEnabled(false);
QString packageId = pkg.value("id").toString(); ui->virtmanager_button->setEnabled(false);
QString packageName = pkg.value("name").toString(); ui->krita_button->setEnabled(false);
QString packageDescription = pkg.value("description").toString();
bool isSnap = pkg.value("snap").toBool();
// 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);
}
} }
// Handle installation modes // Connect the storage items
// Connect radio buttons to lambda functions only once /// Full/Normal/Minimal
if (!m_connectionsMade) { connect(ui->minimal_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
connect(ui->minimal_button, &QRadioButton::toggled, this, [this, hasInternet](bool checked) { connect(ui->normal_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
if (checked && hasInternet) { connect(ui->full_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
// Hide additional packages UI /// Additional Options
ui->extraparty_scroll->setVisible(false); connect(ui->updates_button, &QRadioButton::toggled, this, &PackageSelectViewStep::updatePackageSelections);
ui->extraparty_text->setVisible(false); /// Third-Party Apps
ui->mandatory_warning_label->setVisible(false); connect(ui->element_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
connect(ui->thunderbird_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
// Uncheck and disable all additional package checkboxes connect(ui->virtmanager_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
QVariantList removePackages = m_configurationMap.value("packages").toMap().value("minimal_remove_packages").toList(); connect(ui->krita_button, &QCheckBox::toggled, this, &PackageSelectViewStep::updatePackageSelections);
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
* @brief Handles actions to perform when leaving the step, such as storing selected packages. PackageSelectViewStep::onLeave()
*
* 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();
if (!gs) { QVariantMap config;
qWarning() << "GlobalStorage is not available."; for (auto i = m_packageSelections.begin(); i != m_packageSelections.end(); ++i) {
return; if (exists_and_true(i.key())) {
config.insert(i.key(), i.value());
}
} }
gs->insert("packages", config);
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;
}
}
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) {
* @brief Slot to handle checkbox toggle events. QObject* sender_obj = sender();
* 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 packageId = checkbox->objectName(); QString key = sender_obj->objectName();
m_packageSelections[packageId] = checked;
emit packageSelectionsChanged(); // snake_case -> camelCase
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>(); )

View File

@ -1,143 +1,52 @@
#ifndef PACKAGESELECTVIEWSTEP_H #ifndef PACKAGESELECTVIEWSTEP_H
#define PACKAGESELECTVIEWSTEP_H #define PACKAGESELECTVIEWSTEP_H
#include <QObject> #include <QFile>
#include <QVariantMap> #include <QTextStream>
#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;
* @brief Retrieves the checkbox associated with a given package ID. Ui::pkgselect *ui;
* @param id The package ID. QWidget* m_widget;
* @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 // PACKAGESELECTVIEWSTEP_H #endif

View File

@ -1,51 +0,0 @@
---
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"

View File

@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Package Selection</string> <string>Form</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">QRadioButton { <string notr="true">QRadioButton {
@ -28,27 +28,22 @@ QLabel {
}</string> }</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="17" column="1">
<!-- Installation Mode Label --> <spacer name="verticalSpacer_11">
<item row="1" column="1"> <property name="orientation">
<widget class="QLabel" name="apps_label"> <enum>Qt::Vertical</enum>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property> </property>
<property name="styleSheet"> <property name="sizeType">
<string notr="true">padding-left: 0px; padding-right: 0px;</string> <enum>QSizePolicy::Fixed</enum>
</property> </property>
<property name="text"> <property name="sizeHint" stdset="0">
<string>Installation Mode</string> <size>
<width>20</width>
<height>3</height>
</size>
</property> </property>
</widget> </spacer>
</item> </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">
@ -67,61 +62,23 @@ QLabel {
</property> </property>
</widget> </widget>
</item> </item>
<item row="16" column="1">
<!-- Minimal Installation Description --> <widget class="QLabel" name="extraparty_text">
<item row="10" column="1">
<widget class="QLabel" name="minimal_text">
<property name="font"> <property name="font">
<font> <font>
<pointsize>10</pointsize> <pointsize>18</pointsize>
<italic>true</italic> <weight>50</weight>
<bold>false</bold>
</font> </font>
</property> </property>
<property name="styleSheet">
<string notr="true">padding-left: 0px; padding-right: 0px;</string>
</property>
<property name="text"> <property name="text">
<string>Only the desktop environment</string> <string>Install additional third-party packages</string>
</property> </property>
</widget> </widget>
</item> </item>
<!-- Normal Installation Radio Button -->
<item row="6" column="1">
<widget class="QRadioButton" name="normal_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>Normal Installation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</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"> <item row="2" column="1">
<widget class="QRadioButton" name="full_button"> <widget class="QRadioButton" name="full_button">
<property name="maximumSize"> <property name="maximumSize">
@ -140,10 +97,8 @@ QLabel {
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="1">
<!-- Full Installation Description --> <widget class="QLabel" name="minimal_text">
<item row="3" column="1">
<widget class="QLabel" name="full_text">
<property name="font"> <property name="font">
<font> <font>
<pointsize>10</pointsize> <pointsize>10</pointsize>
@ -151,15 +106,10 @@ QLabel {
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>All applications in the Normal Installation, and all extra third-party packages listed below</string> <string>Only the desktop environment</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property> </property>
</widget> </widget>
</item> </item>
<!-- Spacer Elements -->
<item row="0" column="0"> <item row="0" column="0">
<spacer name="left_spacer"> <spacer name="left_spacer">
<property name="orientation"> <property name="orientation">
@ -176,22 +126,6 @@ QLabel {
</property> </property>
</spacer> </spacer>
</item> </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"> <item row="0" column="2">
<spacer name="right_spacer"> <spacer name="right_spacer">
<property name="orientation"> <property name="orientation">
@ -208,24 +142,19 @@ QLabel {
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="8" column="1"> <item row="20" column="1">
<spacer name="verticalSpacer_6"> <spacer name="pushup">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>10</height> <height>40</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<!-- Additional Options Label -->
<item row="12" column="1"> <item row="12" column="1">
<widget class="QLabel" name="additional_label"> <widget class="QLabel" name="additional_label">
<property name="font"> <property name="font">
@ -243,8 +172,70 @@ QLabel {
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1">
<!-- Update Checkbox --> <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="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="15" column="1">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="13" column="1"> <item row="13" column="1">
<widget class="QCheckBox" name="updates_button"> <widget class="QCheckBox" name="updates_button">
<property name="maximumSize"> <property name="maximumSize">
@ -263,8 +254,6 @@ QLabel {
</property> </property>
</widget> </widget>
</item> </item>
<!-- Updates Text -->
<item row="14" column="1"> <item row="14" column="1">
<widget class="QLabel" name="updates_text"> <widget class="QLabel" name="updates_text">
<property name="font"> <property name="font">
@ -278,9 +267,57 @@ QLabel {
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1">
<!-- Mandatory Warning Label --> <widget class="QLabel" name="normal_text">
<item row="20" column="0" colspan="3"> <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="11" column="1">
<spacer name="verticalSpacer_2">
<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="6" column="1">
<widget class="QRadioButton" name="normal_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>Normal Installation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="19" column="0" colspan="3">
<widget class="QLabel" name="mandatory_warning_label"> <widget class="QLabel" name="mandatory_warning_label">
<property name="font"> <property name="font">
<font> <font>
@ -298,25 +335,8 @@ QLabel {
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<!-- Pushup Spacer --> <widget class="QLabel" name="apps_label">
<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">
<widget class="QLabel" name="extraparty_text">
<property name="font"> <property name="font">
<font> <font>
<pointsize>18</pointsize> <pointsize>18</pointsize>
@ -328,13 +348,11 @@ QLabel {
<string notr="true">padding-left: 0px; padding-right: 0px;</string> <string notr="true">padding-left: 0px; padding-right: 0px;</string>
</property> </property>
<property name="text"> <property name="text">
<string>Install additional third-party packages</string> <string>Installation Mode</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="18" column="1">
<!-- Scroll Area for Additional Packages -->
<item row="19" column="1">
<widget class="QScrollArea" name="extraparty_scroll"> <widget class="QScrollArea" name="extraparty_scroll">
<property name="widgetResizable"> <property name="widgetResizable">
<bool>true</bool> <bool>true</bool>
@ -348,31 +366,227 @@ QLabel {
<height>281</height> <height>281</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="packages_layout"> <layout class="QGridLayout" name="gridLayout_2">
<!-- Dynamic Checkboxes will be added here --> <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="verticalSpacer_9">
<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> </layout>
</widget> </widget>
</widget> </widget>
</item> </item>
<item row="4" column="1">
<!-- Stretch to Push Elements Up --> <spacer name="verticalSpacer_5">
<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::Expanding</enum> <enum>QSizePolicy::Fixed</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>20</width>
<height>40</height> <height>10</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@ -1,37 +0,0 @@
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})

View File

@ -1,573 +0,0 @@
#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, &currentDescription, 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();
}

View File

@ -1,60 +0,0 @@
#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

View File

@ -1,54 +0,0 @@
#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;
}

View File

@ -1,7 +0,0 @@
---
type: "job"
name: "pkgselectprocess"
interface: "qtplugin"
load: "libcalamares_job_pkgselectprocess.so"
noconfig: true
weight: 12

View File

@ -1,7 +0,0 @@
---
dontChroot: false
timeout: 120
script:
- "sed -i 's/oem:x:1000:1000/oem:x:60999:60999/' /etc/passwd"
- "sed -i 's/oem:x:1000/oem:x:60999/' /etc/group"
- "chown -R 60999:60999 /home/oem"

View File

@ -1,5 +1,5 @@
--- ---
dontChroot: false dontChroot: false
timeout: 10800 timeout: 300
script: script:
- /usr/libexec/fixconkeys-part2 - /usr/libexec/fixconkeys-part2

View File

@ -0,0 +1,5 @@
module snap-seed-glue
go 1.22.1
require github.com/snapcore/snapd v0.0.0-20240328101726-fdc222fc37a0

View File

@ -0,0 +1,289 @@
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 ""
}

View File

@ -7,6 +7,5 @@ lubuntu/modules/ etc/calamares/
lubuntu/oem/calamares-launch-oem usr/bin/ lubuntu/oem/calamares-launch-oem usr/bin/
lubuntu/oem/calamares-launch-oem.desktop usr/share/applications/ lubuntu/oem/calamares-launch-oem.desktop usr/share/applications/
lubuntu/oem/calamares-oemprep.sh usr/libexec/ lubuntu/oem/calamares-oemprep.sh usr/libexec/
lubuntu/oem/calamares-raspiprep.sh usr/libexec/
lubuntu/oemconfig.tar.gz etc/calamares/ lubuntu/oemconfig.tar.gz etc/calamares/
lubuntu/settings.conf etc/calamares/ lubuntu/settings.conf etc/calamares/

View File

@ -1 +0,0 @@
usr/lib/calamares/modules/automirror usr/lib/${DEB_HOST_MULTIARCH}/calamares/modules/automirror

View File

@ -0,0 +1,4 @@
# this is an internal implementation detail, no manpage needed
calamares-settings-ubuntu-common: no-manual-page [usr/bin/calamares_snap_install]
# this is normal and not a problem
calamares-settings-ubuntu-common: executable-in-usr-lib [usr/lib/x86_64-linux-gnu/calamares/modules/automirror/main.py]

337
debian/changelog vendored
View File

@ -1,337 +1,6 @@
calamares-settings-ubuntu (1:25.04.27) plucky; urgency=medium
* Disable virt-manager installation in third-party software options, as the
package is broken when installed by pkgselect.
* Remove full installation and third-party software options from all
flavors.
* Fix segfaults during installation. (LP: #2107486)
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Wed, 16 Apr 2025 18:23:56 -0500
calamares-settings-ubuntu (1:25.04.26) plucky; urgency=medium
* [bootloader] Instead of utilizing a contextualprocess to only bind-mount
/cdrom to /media/cdrom when it's a specific type of system, simply add it
to the mounts for all flavors, and move the specific copy of the vmlinuz
file to a dedicated shellprocess module. This will be re-factored next
cycle, ideally being worked directly into a dedicated C++ module instead
of several, miscellaneous shell scripts wrapped in YAML.
* [pkgselectprocess] Explicitly log all apt commands in the debug logs.
* [pkgselectprocess] Ensure apt-cdrom command outputs have their own prefix.
* [checkpackage-backend] Simply pass through packages starting with "^" or
containing "*". For this cycle we can trust our distributors won't do
anything unusual, but next cycle, we need to perform explicit validation
on these items. If you are a downstream, please be careful.
* [pkgselectprocess] Ensure hasInternet is available as a local variable, so
we can use it.
* [pkgselectprocess] When running apt remove, use CPBE just in case.
* [pkgselectprocess] When doing installations without network, we need to
ensure that we don't try to perform apt operations that require internet.
To do this in Plucky, we need to temporarily copy the ubuntu.sources file
to an ubuntu.sources.bak file. To bring all of the previous commits in
this upload together, we use the bind-mounted /media/cdrom not only to
install the correct GRUB packages, but to ensure that we can still install
them and any other packages on ship-live. There has to be a better, more
native way to do this. It works for now, but in the Questing cycle, we're
probably going to move some of these command-line apt calls to be a
consumer of the libapt C library (LP: #2107287).
-- Simon Quigley <tsimonq2@ubuntu.com> Tue, 15 Apr 2025 22:36:52 -0500
calamares-settings-ubuntu (1:25.04.25) plucky; urgency=medium
* [pkgselectprocess] When we are creating the final list of packages to feed
to "apt install," virtual packages which do not have a valid candidate are
included in this list, causing the installation to fail. When creating
this list, use FindGrp instead of FindPkg, and only add it to the list if
there is a valid candidate. Additionally, add these items to an unordered
set, to eliminate deduplication (LP: #2106773).
* [pkgselect] 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. We're doing this
in pkgselect instead of pkgselectprocess because pkgselect already knows
about stacked squashfses, it's what provides the final "additional install
list" to be considered by checkpackage-backend, and this is a temporary
fix anyway (LP: #2104343).
* [pkgselectprocess] To complement the last fix, ensure that Calamares ends
up on the removal list for non-stacked squashfses if and only if OEM is
disabled, and Calamares shows up on the install list only for stacked
squashfses which have OEM enabled. This nuanced approach ensures all
potential combinations have the intended functionality.
* [OEM] Ensure the final desktop file completing OEM is marked as executable.
-- Simon Quigley <tsimonq2@ubuntu.com> Sun, 13 Apr 2025 03:17:13 -0500
calamares-settings-ubuntu (1:25.04.24) plucky; urgency=medium
* Bump Standards-Version to 4.7.2, no changes needed.
* [pkgselectprocess] If checkpackage-backend does not exist in the target
system, likely due to the use of stacked squashfses, ensure it temporarily
exists so it can be used in the install process. This fixes installation
of the Virtual Machine Manager when selected on the Customize menu
(LP: #2104243).
* [OEM] As a temporary stop-gap until this can be completely re-written next
cycle, ensure the sed call in the Calamares OEM setup refers to
pkgselectprocess, not packages. This was preventing the OEM processing
step (as opposed to just the GUI configuration) to be missing
(LP: #2104343).
* [OEM] [Kubuntu] In stage two, ensure we use Wayland, consistent with the
rest of the session scripts.
* [pkgselectprocess] Disable the dpkg trigger inhibition logic this cycle.
The original goal here was to de-duplicate some of the trigger processing
work, but it's obvious this needs more work. It's too premature to ship
right now, unfortunately.
* [Lubuntu] Remove the Dracut configuration so we fall back to the defaults
provided by the package. This is a no-op.
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 09 Apr 2025 07:02:36 -0500
calamares-settings-ubuntu (1:25.04.23) plucky; urgency=medium
* [Kubuntu] Update welcome images for 25.04 (LP: #2104062)
* [Kubuntu] Update 07_Free_and_Open_Source installer slide for plucky
puffin mascot image.
* [Kubuntu] Update 10_Kubuntu_Focus installer slide.
-- Rik Mills <rikmills@kde.org> Mon, 07 Apr 2025 11:38:23 +0100
calamares-settings-ubuntu (1:25.04.22) plucky; urgency=medium
* [Unity] Update welcome slide for Plucky.
* [Unity] Set Kvantum theme to KvGnomeDark for Calamares.
-- Walter Lapchynski <wxl@ubuntu.com> Wed, 26 Mar 2025 00:05:56 +0000
calamares-settings-ubuntu (1:25.04.21) plucky; urgency=medium
* Update partition names to match current version.
-- Walter Lapchynski <wxl@ubuntu.com> Mon, 24 Mar 2025 22:46:46 +0000
calamares-settings-ubuntu (1:25.04.20) plucky; urgency=medium
* Update OEM batch identifier to match current version.
-- Walter Lapchynski <wxl@ubuntu.com> Mon, 24 Mar 2025 07:01:24 +0000
calamares-settings-ubuntu (1:25.04.19) plucky; urgency=medium
* [Lubuntu] Update slides for current applications:
* Support: IRC -> Matrix, Lubuntu -> Ubuntu Discourse
* Lightweight: KCalc -> Qalc
-- Walter Lapchynski <wxl@ubuntu.com> Fri, 07 Mar 2025 03:21:03 +0000
calamares-settings-ubuntu (1:25.04.18) plucky; urgency=medium
* Add python3 as build-dep.
-- Walter Lapchynski <wxl@ubuntu.com> Fri, 07 Mar 2025 01:11:36 +0000
calamares-settings-ubuntu (1:25.04.17) plucky; urgency=medium
* [Lubuntu] Update welcome slides for Plucky.
-- Walter Lapchynski <wxl@ubuntu.com> Thu, 06 Mar 2025 10:23:08 +0000
calamares-settings-ubuntu (1:25.04.16) plucky; urgency=medium
* Fix installation of apt packages more consistently (LP: #2089494).
-- Simon Quigley <tsimonq2@ubuntu.com> Mon, 24 Feb 2025 03:53:14 -0600
calamares-settings-ubuntu (1:25.04.15) plucky; urgency=medium
* Move calamares -> libcalamares-dev for build dependencies.
* [basicwallpaper] Bump minimum CMake version, remove .user file.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 21 Feb 2025 13:10:40 -0600
calamares-settings-ubuntu (1:25.04.14) plucky; urgency=medium
* Add dh-sequence-qmldeps and ${qml6:Depends} to ensure all QML 6 runtime
dependencies are properly picked up.
* Run wrap-and-sort.
-- Simon Quigley <tsimonq2@ubuntu.com> Tue, 18 Feb 2025 01:29:25 -0600
calamares-settings-ubuntu (1:25.04.13) plucky; urgency=medium
* [users] Set allowWeakPasswords and allowWeakPasswordsDefault to false for
all three flavors, but add some basic password recommendations based on
NIST standards, warning if the password falls outside of that.
* [packaging] Bump Calamares dependency to 3.3.13-0ubuntu4 for users fixes.
-- Simon Quigley <tsimonq2@ubuntu.com> Sun, 16 Feb 2025 18:05:36 -0600
calamares-settings-ubuntu (1:25.04.12) plucky; urgency=medium
* [Lubuntu] Update password requirements to match NIST recommendations.
* [Lubuntu] Allow user to override password requirements, but not by
default.
-- Walter Lapchynski <wxl@ubuntu.com> Tue, 28 Jan 2025 17:14:06 +0000
calamares-settings-ubuntu (1:25.04.11) plucky; urgency=medium
* Rearrange the Lubuntu module order to account for packages with new stuff
to put in the initramfs.
* Make forbidden_names much stronger (LP: #2088576).
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 27 Nov 2024 23:28:28 -0600
calamares-settings-ubuntu (1:25.04.10) plucky; urgency=medium
* [pkgselectprocess] Add dpkg diversions for dracut, update-initramfs, and
locale-gen. These will be called later in the process.
* [pkgselectprocess] Add a more robust check for apt packages when
installing them (LP: #2089494).
-- Simon Quigley <tsimonq2@ubuntu.com> Sun, 24 Nov 2024 20:51:38 -0600
calamares-settings-ubuntu (1:25.04.9) plucky; urgency=medium
* Add a Dracut config file for Lubuntu.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 22 Nov 2024 19:56:22 -0600
calamares-settings-ubuntu (1:25.04.8) plucky; urgency=medium
* Add new global storage value for stacked squashfses and adjust config.
* Switch Lubuntu to dracut.
* Fix apt install functionality in pkgselectprocess.
-- Simon Quigley <tsimonq2@ubuntu.com> Thu, 21 Nov 2024 22:27:59 -0600
calamares-settings-ubuntu (1:25.04.7) plucky; urgency=medium
* Change oem user in Lubuntu raspi prep to user number 60999
-- Erich Eickmeyer <eeickmeyer@ubuntu.com> Wed, 20 Nov 2024 17:05:19 -0800
calamares-settings-ubuntu (1:25.04.6) plucky; urgency=medium
* Lubuntu raspi prep: Create oem user so it can actually login to sddm
-- Erich Eickmeyer <eeickmeyer@ubuntu.com> Wed, 20 Nov 2024 16:58:28 -0800
calamares-settings-ubuntu (1:25.04.5) plucky; urgency=medium
* Fix Vcs to point to ubuntu-qt-code team LP git.
-- Rik Mills <rikmills@kde.org> Tue, 12 Nov 2024 18:29:43 +0000
calamares-settings-ubuntu (1:25.04.4) plucky; urgency=medium
* kubuntu/modules/pkgselect.conf: Remove fcitx* from installed system.
-- Rik Mills <rikmills@kde.org> Tue, 12 Nov 2024 17:47:40 +0000
calamares-settings-ubuntu (1:25.04.3) plucky; urgency=medium
* Lubuntu: Set executable bit on raspberry pi prep script
-- Erich Eickmeyer <eeickmeyer@ubuntu.com> Sun, 10 Nov 2024 06:30:46 -0800
calamares-settings-ubuntu (1:25.04.2) plucky; urgency=medium
* Lubuntu: Add raspberry pi prep script
-- Erich Eickmeyer <eeickmeyer@ubuntu.com> Sat, 09 Nov 2024 09:25:43 -0800
calamares-settings-ubuntu (1:25.04.1) plucky; urgency=medium
* Welcome to Plucky Puffin!
* Port to Qt 6.
* Rewrite the pkgselect module and its processing.
-- Simon Quigley <tsimonq2@ubuntu.com> Tue, 22 Oct 2024 19:23:22 -0500
calamares-settings-ubuntu (1:24.10.5) oracular; urgency=medium
* Update Kubuntu slideshow for 24.10 (LP: #2080925)
-- Rik Mills <rikmills@kde.org> Sat, 28 Sep 2024 21:46:11 +0100
calamares-settings-ubuntu (1:24.10.4) oracular; urgency=medium
* Fix welcome image for Kubuntu, Lubuntu, and Ubuntu Unity. (LP: #2080925)
* Set root partition name properly for Kubuntu, Lubuntu, and Ubuntu Unity.
(LP: #2065602)
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Tue, 24 Sep 2024 22:23:11 -0500
calamares-settings-ubuntu (1:24.10.3) oracular; urgency=medium
* Fix pkgselect UI becoming centered when minimal install mode is selected.
(LP: #2076303)
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Thu, 08 Aug 2024 14:25:24 -0500
calamares-settings-ubuntu (1:24.10.2) oracular; urgency=medium
* kubuntu: Change donate URL to point to Kubuntu's donation page
* kubuntu: Use networkcheck.kde.org for checking for an Internet connection
* kubuntu: Do not recommend that the user have an Internet connection during
first-time user setup after an OEM installation
* ubuntuunity: Do not recommend that the user have an Internet connection
during first-time user setup after an OEM installation
* all: Change the UID of the OEM configuration user to 60999.
- This is done because otherwise the OEM configuration user is given UID
1000. This results in the first real user on the machine having UID
1001, which could cause issues in a single-user deployment where the
user must have or is assumed to have UID 1000. Setting the OEM
configuration user's UID to 60999 results in the first real user having
UID 1000. This is similar (though not identical) to Ubiquity's behavior
with the OEM configuration user.
* kubuntu: Use QT_QPA_PLATFORMTHEME="kde" rather than
QT_STYLE_OVERRIDE="Breeze" for the OEM first-time setup session.
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Wed, 12 Jun 2024 23:26:13 -0500
calamares-settings-ubuntu (1:24.10.1) oracular; urgency=medium
* Welcome to Oracular Oriole!
-- Simon Quigley <tsimonq2@ubuntu.com> Tue, 30 Apr 2024 15:24:38 -0500
calamares-settings-ubuntu (1:24.04.39) noble; urgency=medium
* Fix permissions on /home/oem when doing OEM installations. (LP: #2063403)
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Thu, 25 Apr 2024 00:01:37 -0500
calamares-settings-ubuntu (1:24.04.38) noble; urgency=high
* Do not remove zram-config on Ubuntu Unity, it does not exist in the first
place (LP: #2063108).
-- Simon Quigley <tsimonq2@ubuntu.com> Mon, 22 Apr 2024 07:10:28 -0500
calamares-settings-ubuntu (1:24.04.37) noble; urgency=medium
* Correctly lengthen timeouts for network and initramfs package commands.
(LP: #2060429)
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Fri, 19 Apr 2024 18:52:09 -0500
calamares-settings-ubuntu (1:24.04.36) noble; urgency=medium
* Don't show Thunderbird as an installable third-party app on Kubuntu.
(LP: #2062438)
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Fri, 19 Apr 2024 17:38:06 -0500
calamares-settings-ubuntu (1:24.04.35) noble; urgency=medium
* Remove timeouts for network-related package commands. (LP: #2062106)
* Remove timeouts for update-initramfs. (LP: #2060429)
-- Walter Lapchynski <wxl@ubuntu.com> Fri, 19 Apr 2024 21:23:54 +0000
calamares-settings-ubuntu (1:24.04.34) noble; urgency=medium calamares-settings-ubuntu (1:24.04.34) noble; urgency=medium
* Add icon on Desktop to finish OEM install. (LP: #2060928) * Add icon on Desktop to finish OEM install. (LP: #2060928)
-- Walter Lapchynski <wxl@ubuntu.com> Fri, 19 Apr 2024 19:18:59 +0000 -- Walter Lapchynski <wxl@ubuntu.com> Fri, 19 Apr 2024 19:18:59 +0000
@ -374,7 +43,7 @@ calamares-settings-ubuntu (1:24.04.29) noble; urgency=medium
calamares-settings-ubuntu (1:24.04.28) noble; urgency=medium calamares-settings-ubuntu (1:24.04.28) noble; urgency=medium
* Run apt updates before installing packages. (LP: #2061150) * Run apt updates before installing packages. (LP: #2061150)
-- Walter Lapchynski <wxl@ubuntu.com> Sat, 13 Apr 2024 00:44:32 +0000 -- Walter Lapchynski <wxl@ubuntu.com> Sat, 13 Apr 2024 00:44:32 +0000
@ -458,7 +127,7 @@ calamares-settings-ubuntu (1:24.04.19) noble; urgency=medium
calamares-settings-ubuntu (1:24.04.18) noble; urgency=medium calamares-settings-ubuntu (1:24.04.18) noble; urgency=medium
* GeoIP in welcome module disabled. * GeoIP in welcome module disabled.
-- Walter Lapchynski <wxl@ubuntu.com> Wed, 13 Mar 2024 18:16:06 +0000 -- Walter Lapchynski <wxl@ubuntu.com> Wed, 13 Mar 2024 18:16:06 +0000

69
debian/control vendored
View File

@ -3,34 +3,31 @@ Section: devel
Priority: optional Priority: optional
Maintainer: Lubuntu Developers <lubuntu-devel@lists.ubuntu.com> Maintainer: Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
Uploaders: Simon Quigley <tsimonq2@ubuntu.com> Uploaders: Simon Quigley <tsimonq2@ubuntu.com>
Build-Depends: debhelper-compat (= 13), Build-Depends: calamares (>= 3.3.5),
dh-sequence-qmldeps,
cmake, cmake,
debhelper-compat (= 13),
extra-cmake-modules, extra-cmake-modules,
fakeroot, golang-github-snapcore-snapd-dev (>= 2.62),
golang-go,
golang-gopkg-yaml.v2-dev,
intltool, intltool,
libapt-pkg-dev, libkf5coreaddons-dev,
libcalamares-dev (>= 3.3.13-0ubuntu4), libqt5svg5-dev,
libkf6coreaddons-dev,
libqt6svg6-dev,
libyaml-cpp-dev, libyaml-cpp-dev,
python3, qtbase5-dev,
qt6-base-dev, qtdeclarative5-dev,
qt6-declarative-dev, qttools5-dev,
qt6-l10n-tools, qttools5-dev-tools
qt6-tools-dev, Standards-Version: 4.6.2
qt6-tools-dev-tools
Standards-Version: 4.7.2
Homepage: https://code.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu Homepage: https://code.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu
Vcs-Browser: https://git.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu Vcs-Browser: https://git.lubuntu.me/Lubuntu/calamares-settings-ubuntu/
Vcs-Git: https://git.launchpad.net/~ubuntu-qt-code/+git/calamares-settings-ubuntu Vcs-Git: https://git.lubuntu.me/Lubuntu/calamares-settings-ubuntu.git
Rules-Requires-Root: no Rules-Requires-Root: no
Package: calamares-settings-kubuntu Package: calamares-settings-kubuntu
Architecture: all Architecture: all
Depends: calamares-settings-ubuntu-common (>= ${binary:Version}), Depends: calamares-settings-ubuntu-common (>= ${binary:Version}),
${misc:Depends}, ${misc:Depends}
${qml6:Depends}
Conflicts: calamares-settings-ubuntu-flavor Conflicts: calamares-settings-ubuntu-flavor
Provides: calamares-settings-ubuntu-flavor Provides: calamares-settings-ubuntu-flavor
Description: Kubuntu Calamares Settings and Branding Description: Kubuntu Calamares Settings and Branding
@ -42,8 +39,7 @@ Description: Kubuntu Calamares Settings and Branding
Package: calamares-settings-lubuntu Package: calamares-settings-lubuntu
Architecture: all Architecture: all
Depends: calamares-settings-ubuntu-common (>= ${binary:Version}), Depends: calamares-settings-ubuntu-common (>= ${binary:Version}),
${misc:Depends}, ${misc:Depends}
${qml6:Depends}
Recommends: lubuntu-installer-prompt Recommends: lubuntu-installer-prompt
Conflicts: calamares-settings-ubuntu-flavor Conflicts: calamares-settings-ubuntu-flavor
Provides: calamares-settings-ubuntu-flavor Provides: calamares-settings-ubuntu-flavor
@ -56,10 +52,9 @@ Description: Lubuntu Calamares Settings and Branding
Package: calamares-settings-ubuntu-unity Package: calamares-settings-ubuntu-unity
Architecture: all Architecture: all
Depends: calamares-settings-ubuntu-common (>= ${binary:Version}), Depends: calamares-settings-ubuntu-common (>= ${binary:Version}),
qt6-style-kvantum, qt5-style-kvantum,
qt6-style-kvantum-themes, qt5-style-kvantum-themes,
${misc:Depends}, ${misc:Depends}
${qml6:Depends}
Conflicts: calamares-settings-ubuntu-flavor Conflicts: calamares-settings-ubuntu-flavor
Provides: calamares-settings-ubuntu-flavor Provides: calamares-settings-ubuntu-flavor
Description: Ubuntu Unity Calamares Settings and Branding Description: Ubuntu Unity Calamares Settings and Branding
@ -70,14 +65,14 @@ Description: Ubuntu Unity Calamares Settings and Branding
Package: calamares-settings-ubuntu-common Package: calamares-settings-ubuntu-common
Architecture: any Architecture: any
Depends: calamares (>= 3.3.13-0ubuntu4), Depends: calamares (>= 3.2.14~),
calamares-settings-ubuntu-common-data (= ${binary:Version}),
cryptsetup, cryptsetup,
dracut-core,
kdialog, kdialog,
keyutils, keyutils,
libglib2.0-bin, python3,
snapd-seed-glue, python3-distro,
qml-module-qtquick-window2,
qml-module-qtquick2,
squashfs-tools, squashfs-tools,
sudo, sudo,
${misc:Depends}, ${misc:Depends},
@ -86,19 +81,3 @@ Description: Common Calamares Settings
This package contains the common Calamares settings for all flavors. This package contains the common Calamares settings for all flavors.
There is also a automirror Python script to set sources based on There is also a automirror Python script to set sources based on
geolocation. geolocation.
.
Common settings for all Ubuntu flavors.
Package: calamares-settings-ubuntu-common-data
Architecture: all
Depends: ${misc:Depends},
python3,
python3-distro,
Conflicts: calamares-settings-ubuntu-common (<< 1:25.04.16)
Replaces: calamares-settings-ubuntu-common (<< 1:25.04.16)
Description: Data for Common Calamares Settings
This package contains the common Calamares settings for all flavors.
There is also a automirror Python script to set sources based on
geolocation.
.
Architecture-independent data for the common Calamares settings.

View File

@ -1 +0,0 @@
calamares.slideshow calamares

37
debian/rules vendored
View File

@ -5,26 +5,21 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all
export GOPATH=/usr/share/gocode 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 PKGSELECTPROCESS = "common/modules/pkgselectprocess"
export USRDIR = "debian/calamares-settings-ubuntu-common/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 DATA_MODULES_DIR = "debian/calamares-settings-ubuntu-common-data/usr/lib/calamares/modules"
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
PKGSELECT = "common/modules/pkgselect"
MODULES_DIR = "debian/calamares-settings-ubuntu-common/usr/lib/$(DEB_HOST_MULTIARCH)/calamares/modules"
%: %:
dh $@ dh $@
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 $(PKGSELECTPROCESS)/build && $(MAKE)) (cd common/snap-seed-glue && go build -gcflags="all=-N -l" -ldflags="-compressdwarf=false" -o snap-seed-glue main.go)
override_dh_auto_clean: override_dh_auto_clean:
dh_auto_clean dh_auto_clean
@ -35,19 +30,17 @@ override_dh_auto_install:
override_dh_missing: override_dh_missing:
dh_missing dh_missing
mkdir -pv $(MODULES_DIR) $(DATA_MODULES_DIR) mkdir -pv $(MODULES_DIR)
cp -vr common/modules/automirror $(DATA_MODULES_DIR) cp -vr common/modules/automirror $(MODULES_DIR)
mkdir -pv debian/calamares-settings-ubuntu-common-data/etc/calamares/modules mkdir -pv debian/calamares-settings-ubuntu-common/etc/calamares/modules
cp -vr common/modules/*.conf debian/calamares-settings-ubuntu-common-data/etc/calamares/modules cp -vr common/modules/*.conf debian/calamares-settings-ubuntu-common/etc/calamares/modules
chmod 644 $(DATA_MODULES_DIR)/automirror/automirror.conf chmod -R 755 debian/calamares-settings-ubuntu-common/usr/lib/
chmod 644 $(DATA_MODULES_DIR)/automirror/module.desc chmod 644 $(MODULES_DIR)/automirror/automirror.conf
chmod 644 $(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 $(MODULES_DIR)/pkgselectprocess mkdir -pv debian/calamares-settings-ubuntu-common/usr/bin/
cp -v $(PKGSELECTPROCESS)/build/*.so $(PKGSELECTPROCESS)/build/*.desc $(MODULES_DIR)/pkgselectprocess cp -v common/snap-seed-glue/snap-seed-glue debian/calamares-settings-ubuntu-common/usr/bin/snap-seed-glue
chmod 644 $(MODULES_DIR)/pkgselectprocess/libcalamares_job_pkgselectprocess.so mkdir -pv debian/calamares-settings-ubuntu-common/usr/libexec/
chmod 644 $(MODULES_DIR)/pkgselectprocess/module.desc cp -v common/fixconkeys-part1 debian/calamares-settings-ubuntu-common/usr/libexec/fixconkeys-part1
mkdir -pv $(USRDIR)/libexec/ $(DATA_USRDIR)/libexec/ cp -v common/fixconkeys-part2 debian/calamares-settings-ubuntu-common/usr/libexec/fixconkeys-part2
cp -v common/fixconkeys-part1 $(DATA_USRDIR)/libexec/fixconkeys-part1
cp -v common/fixconkeys-part2 $(DATA_USRDIR)/libexec/fixconkeys-part2
cp -v $(PKGSELECTPROCESS)/build/check_package $(USRDIR)/libexec/checkpackage-backend

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -6,10 +6,10 @@ windowExpanding: fullscreen
strings: strings:
productName: Kubuntu productName: Kubuntu
shortProductName: Kubuntu shortProductName: Kubuntu
version: 25.04 version: 24.04 LTS
shortVersion: plucky shortVersion: noble
versionedName: Kubuntu versionedName: Kubuntu
shortVersionedName: Kubuntu 25.04 shortVersionedName: Kubuntu 24.04 LTS
bootloaderEntryName: Kubuntu bootloaderEntryName: Kubuntu
productUrl: https://kubuntu.org/ productUrl: https://kubuntu.org/
supportUrl: https://kubuntu.org/contact/ supportUrl: https://kubuntu.org/contact/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View File

@ -1,7 +1,7 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Version=1.0 Version=1.0
_Name=Install Kubuntu 25.04 _Name=Install Kubuntu 24.04 LTS
_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

View File

@ -1,2 +1,2 @@
--- ---
batch-identifier: kubuntu-2504-${DATE} batch-identifier: kubuntu-2404-${DATE}

View File

@ -0,0 +1,16 @@
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

View File

@ -15,7 +15,7 @@ partitionLayout:
onlyPresentWithEncryption: true onlyPresentWithEncryption: true
mountPoint: "/boot" mountPoint: "/boot"
size: 4G size: 4G
- name: "kubuntu_2504" - name: "kubuntu_2404"
filesystem: unknown filesystem: unknown
mountPoint: "/" mountPoint: "/"
size: 100% size: 100%

View File

@ -1,57 +0,0 @@
---
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"

View File

@ -0,0 +1,19 @@
---
dontChroot: false
timeout: 900
"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"

View File

@ -0,0 +1,9 @@
---
dontChroot: true
timeout: 900
"packages.elementButton":
true: "snap-seed-glue --seed ${ROOT}/var/lib/snapd/seed element-desktop"
"packages.kritaButton":
true: "snap-seed-glue --seed ${ROOT}/var/lib/snapd/seed krita"
"packages.thunderbirdButton":
true: "snap-seed-glue --seed ${ROOT}/var/lib/snapd/seed thunderbird"

View File

@ -13,64 +13,10 @@ defaultGroups:
system: true system: true
- sudo - sudo
passwordRequirements: passwordRequirements:
minLength: 8 minLength: 1
maxLength: -1 maxLength: -1
libpwquality:
- minlen=8
- maxrepeat=3
- maxsequence=3
- usersubstr=4
- badwords=linux
allowWeakPasswords: false
allowWeakPasswordsDefault: false
# Explicitly set the shell instead of deferring to Calamares. We have a platform # Explicitly set the shell instead of deferring to Calamares. We have a platform
# expectation derived from Ubuntu here. # expectation derived from Ubuntu here.
user: user:
shell: /bin/bash shell: /bin/bash
forbidden_names: forbidden_names: [ root ]
- root
- nginx
- www-data
- daemon
- bin
- sys
- sync
- games
- man
- lp
- mail
- news
- uucp
- proxy
- www-data
- backup
- list
- irc
- apt
- nobody
- systemd-network
- systemd-timesync
- dhcpcd
- messagebus
- syslog
- systemd-resolve
- usbmux
- tss
- uuidd
- whoopsie
- dnsmasq
- avahi
- nm-openvpn
- tcpdump
- speech-dispatcher
- cups-pk-helper
- fwupd-refresh
- sddm
- saned
- cups-browsed
- hplip
- polkitd
- rtkit
- colord
- geoclue
- installer

View File

@ -3,12 +3,12 @@ showSupportUrl: true
showKnownIssuesUrl: true showKnownIssuesUrl: true
showReleaseNotesUrl: true showReleaseNotesUrl: true
# WARNING: Calamares documentation indicates that showDonateUrl will be moved to branding in the future. Be prepared for things to break right here. # WARNING: Calamares documentation indicates that showDonateUrl will be moved to branding in the future. Be prepared for things to break right here.
showDonateUrl: https://kubuntu.org/donate/ showDonateUrl: https://lubuntu.me/donate/
requirements: requirements:
requiredStorage: 8 requiredStorage: 8
requiredRam: 0.5 requiredRam: 0.5
internetCheckUrl: https://networkcheck.kde.org internetCheckUrl: https://lubuntu.me
check: check:
- storage - storage

View File

@ -29,10 +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 "/- pkgselectprocess$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf; sed -i "/- packages$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
# Fix OEM UID
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
# Force the user of an OEM configuration user # Force the user of an OEM configuration user
cp /etc/calamares/modules/users.conf.oem /etc/calamares/modules/users.conf; cp /etc/calamares/modules/users.conf.oem /etc/calamares/modules/users.conf;

View File

@ -1,7 +1,7 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Version=1.0 Version=1.0
Name=Install Kubuntu 25.04 (OEM mode) Name=Install Kubuntu 24.04 LTS (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

View File

@ -5,11 +5,6 @@
# Install the OEM configuration for Calamares # Install the OEM configuration for Calamares
tar xvzf /etc/calamares/oemconfig.tar.gz -C "$1" --strip-components=2; tar xvzf /etc/calamares/oemconfig.tar.gz -C "$1" --strip-components=2;
chown -R 1000:1000 "$1"/home/oem
# Ensure the desktop file is marked as trusted
# See line 96 of scripts/casper-bottom/25adduser in src:casper as shipped in Plucky
gio set /home/oem/Desktop/calamares-finish-oem.desktop metadata::trusted true
# Enable passwordless sudo for the OEM user, making sure this can be undone later # Enable passwordless sudo for the OEM user, making sure this can be undone later
mv "$1"/etc/sudoers "$1"/etc/sudoers.orig mv "$1"/etc/sudoers "$1"/etc/sudoers.orig

View File

@ -1,15 +1,11 @@
#!/bin/bash #!/bin/bash
# Starts the Kubuntu OEM Environment. # Starts the Kubuntu OEM Environment.
export XDG_SESSION_CLASS="user" export QT_STYLE_OVERRIDE="Breeze"
export XDG_SESSION_DESKTOP="KDE"
export DESKTOP_SESSION="plasma"
export QT_QPA_PLATFORMTHEME="kde"
export BROWSER='sudo -H -u kubuntu firefox' export BROWSER='sudo -H -u kubuntu firefox'
/usr/bin/kwin_wayland --no-lockscreen & /usr/bin/kwin_x11 &
while [ ! -e "/run/user/$(id -u)/wayland-0" ]; do sleep 1; done
/usr/bin/basicwallpaper /usr/share/wallpapers/Next/contents/3840x2160.png & /usr/bin/basicwallpaper /usr/share/wallpapers/Next/contents/3840x2160.png &
WAYLAND_DISPLAY="wayland-0" sudo -E /usr/bin/calamares -D8 # This is intentionally *not* backgrounded. sudo -E /usr/bin/calamares -D8 # This is intentionally *not* backgrounded.
# If it exits... # If it exits...
killall basicwallpaper killall basicwallpaper
killall kwin_wayland killall kwin_x11

View File

@ -3,16 +3,18 @@ showSupportUrl: true
showKnownIssuesUrl: true showKnownIssuesUrl: true
showReleaseNotesUrl: true showReleaseNotesUrl: true
# WARNING: Calamares documentation indicates that showDonateUrl will be moved to branding in the future. Be prepared for things to break right here. # WARNING: Calamares documentation indicates that showDonateUrl will be moved to branding in the future. Be prepared for things to break right here.
showDonateUrl: https://kubuntu.org/donate/ showDonateUrl: https://lubuntu.me/donate/
requirements: requirements:
requiredStorage: 8 requiredStorage: 8
requiredRam: 0.5 requiredRam: 0.5
internetCheckUrl: https://lubuntu.me
check: check:
- storage - storage
- ram - ram
- power - power
- internet
- root - root
required: required:
- root - root

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "تثبيت كوبونتو 25.04" msgstr "تثبيت كوبونتو 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Instal·lar Kubuntu 25.04" msgstr "Instal·lar Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Installer Kubuntu 25.04" msgstr "Installer Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Kubuntu 25.04 installieren" msgstr "Kubuntu 24.04 LTS installieren"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Instalar Kubuntu 25.04" msgstr "Instalar Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Installer Kubuntu 25.04" msgstr "Installer Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Installa Kubuntu 25.04" msgstr "Installa Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Installer Kubuntu 25.04" msgstr "Installer Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Zainstaluj Kubuntu 25.04" msgstr "Zainstaluj Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Instalar o Kubuntu 25.04" msgstr "Instalar o Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "Instalar Kubuntu 25.04" msgstr "Instalar Kubuntu 24.04 LTS"
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2
msgid "Install Kubuntu" msgid "Install Kubuntu"

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Kubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../kubuntu-calamares.desktop.in.h:2 #: ../kubuntu-calamares.desktop.in.h:2

View File

@ -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,6 +17,12 @@ 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
@ -26,9 +32,6 @@ instances:
- id: fixconkeys_part2 - id: fixconkeys_part2
module: shellprocess module: shellprocess
config: shellprocess_fixconkeys_part2.conf config: shellprocess_fixconkeys_part2.conf
- id: fix-oem-uid
module: shellprocess
config: shellprocess_fix_oem_uid.conf
sequence: sequence:
- show: - show:
@ -53,18 +56,20 @@ sequence:
- displaymanager - displaymanager
- networkcfg - networkcfg
- hwclock - hwclock
- shellprocess@copy_vmlinuz_shellprocess - contextualprocess@before_bootloader_mkdirs
- shellprocess@bug-LP#1829805 - shellprocess@bug-LP#1829805
- shellprocess@fixconkeys_part1
- shellprocess@fixconkeys_part2
- initramfscfg - initramfscfg
- initramfs - initramfs
- grubcfg - grubcfg
- contextualprocess@before_bootloader - contextualprocess@before_bootloader
- bootloader - bootloader
- shellprocess@add386arch
- automirror - automirror
- pkgselectprocess - shellprocess@add386arch
- shellprocess@fixconkeys_part1
- shellprocess@fixconkeys_part2
- packages
- contextualprocess@pkgselect_action
- contextualprocess@pkgselect_snap_action
- shellprocess@logs - shellprocess@logs
- umount - umount
- show: - show:

View File

@ -6,10 +6,10 @@ windowExpanding: fullscreen
strings: strings:
productName: Lubuntu productName: Lubuntu
shortProductName: Lubuntu shortProductName: Lubuntu
version: 25.04 version: 24.04 LTS
shortVersion: plucky shortVersion: noble
versionedName: Lubuntu versionedName: Lubuntu
shortVersionedName: Lubuntu 25.04 shortVersionedName: Lubuntu 24.04 LTS
bootloaderEntryName: Ubuntu bootloaderEntryName: Ubuntu
productUrl: https://lubuntu.me/ productUrl: https://lubuntu.me/
supportUrl: https://lubuntu.me/links/ supportUrl: https://lubuntu.me/links/

View File

@ -4,7 +4,7 @@ LANGUAGES := ar ca de es eu gl be da el et fr ko pl pt pt_BR
all: all:
for i in $(LANGUAGES); do \ for i in $(LANGUAGES); do \
/usr/lib/qt6/bin/lrelease "calamares-lubuntu_$$i.ts"; \ /usr/lib/qt5/bin/lrelease "calamares-lubuntu_$$i.ts"; \
rm calamares-lubuntu_$$i.ts; \ rm calamares-lubuntu_$$i.ts; \
done done

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,7 +1,7 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Version=1.0 Version=1.0
_Name=Install Lubuntu 25.04 _Name=Install Lubuntu 24.04 LTS
_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

View File

@ -1,2 +1,2 @@
--- ---
batch-identifier: lubuntu-2504-${DATE} batch-identifier: lubuntu-2404-${DATE}

View File

@ -0,0 +1,17 @@
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

View File

@ -15,7 +15,7 @@ partitionLayout:
onlyPresentWithEncryption: true onlyPresentWithEncryption: true
mountPoint: "/boot" mountPoint: "/boot"
size: 4G size: 4G
- name: "lubuntu_2504" - name: "lubuntu_2404"
filesystem: unknown filesystem: unknown
mountPoint: "/" mountPoint: "/"
size: 100% size: 100%

View File

@ -1,26 +0,0 @@
---
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"

View File

@ -0,0 +1,19 @@
---
dontChroot: false
timeout: 900
"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"

View File

@ -0,0 +1,9 @@
---
dontChroot: true
timeout: 900
"packages.elementButton":
true: "snap-seed-glue --seed ${ROOT}/var/lib/snapd/seed element-desktop"
"packages.kritaButton":
true: "snap-seed-glue --seed ${ROOT}/var/lib/snapd/seed krita"
"packages.thunderbirdButton":
true: "snap-seed-glue --seed ${ROOT}/var/lib/snapd/seed thunderbird"

View File

@ -1,9 +1,5 @@
---
unpack: unpack:
- source: "/cdrom/casper/minimal.squashfs" - source: "/cdrom/casper/filesystem.squashfs"
sourcefs: "squashfs" sourcefs: "squashfs"
destination: "" destination: ""
condition: true
- source: "/cdrom/casper/minimal.standard.squashfs"
sourcefs: "squashfs"
destination: ""
condition: "installation_data.unpack_regular"

View File

@ -13,69 +13,11 @@ defaultGroups:
system: true system: true
- sudo - sudo
passwordRequirements: passwordRequirements:
minLength: 8 minLength: 1
maxLength: -1 maxLength: -1
libpwquality:
- minlen=8
- maxrepeat=3
- maxsequence=3
- usersubstr=4
- badwords=linux
allowWeakPasswords: false
allowWeakPasswordsDefault: false
# Explicitly set the shell instead of deferring to Calamares. We have a platform # Explicitly set the shell instead of deferring to Calamares. We have a platform
# expectation derived from Ubuntu here. # expectation derived from Ubuntu here.
#
# The forbidden_names list is grabbed from `awk -F: '{print $1}' /etc/passwd`
# on a live ISO. _apt was changed to apt, lubuntu was removed, and nginx and
# www-data were added
user: user:
shell: /bin/bash shell: /bin/bash
forbidden_names: forbidden_names: [ root ]
- root
- nginx
- www-data
- daemon
- bin
- sys
- sync
- games
- man
- lp
- mail
- news
- uucp
- proxy
- www-data
- backup
- list
- irc
- apt
- nobody
- systemd-network
- systemd-timesync
- dhcpcd
- messagebus
- syslog
- systemd-resolve
- usbmux
- tss
- uuidd
- whoopsie
- dnsmasq
- avahi
- nm-openvpn
- tcpdump
- speech-dispatcher
- cups-pk-helper
- fwupd-refresh
- sddm
- saned
- cups-browsed
- hplip
- polkitd
- rtkit
- colord
- geoclue
- installer
allowActiveDirectory: true allowActiveDirectory: true

View File

@ -29,10 +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 "/- pkgselectprocess$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf; sed -i "/- packages$/a \ \ - shellprocess@oemprep" /etc/calamares/settings.conf;
# Fix OEM UID
sed -i "/- shellprocess@oemprep$/a \ \ - shellprocess@fix-oem-uid" /etc/calamares/settings.conf;
# Force the user of an OEM configuration user # Force the user of an OEM configuration user
cp /etc/calamares/modules/users.conf.oem /etc/calamares/modules/users.conf; cp /etc/calamares/modules/users.conf.oem /etc/calamares/modules/users.conf;

View File

@ -1,7 +1,7 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Version=1.0 Version=1.0
Name=Install Lubuntu 25.04 (OEM mode) Name=Install Lubuntu 24.04 LTS (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

View File

@ -5,11 +5,6 @@
# Install the OEM configuration for Calamares # Install the OEM configuration for Calamares
tar xvzf /etc/calamares/oemconfig.tar.gz -C "$1" --strip-components=2; tar xvzf /etc/calamares/oemconfig.tar.gz -C "$1" --strip-components=2;
chown -R 1000:1000 "$1"/home/oem
# Ensure the desktop file is marked as trusted
# See line 96 of scripts/casper-bottom/25adduser in src:casper as shipped in Plucky
gio set /home/oem/Desktop/calamares-finish-oem.desktop metadata::trusted true
# Enable passwordless sudo for the OEM user, making sure this can be undone later # Enable passwordless sudo for the OEM user, making sure this can be undone later
mv "$1"/etc/sudoers "$1"/etc/sudoers.orig mv "$1"/etc/sudoers "$1"/etc/sudoers.orig

View File

@ -1,17 +0,0 @@
#!/bin/bash
# Preps the preinstalled system to go straight into
# First user configuration mode, bypassing oem config
# mode
useradd -G adm,cdrom,dip,lpadmin,plugdev,sambashare,sudo -m -s /bin/bash -u 60999 oem
/usr/libexec/calamares-oemprep.sh
sddm_file="$(cat <<EOL
[Autologin]
Session=lubuntu-oem-environment
User=oem
EOL
)"
echo "$sddm_file" > /etc/sddm.conf

View File

@ -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.04" msgid "Install Lubuntu 24.04 LTS"
msgstr "تنصيب لوبينتو 25.04" msgstr "تنصيب لوبينتو 24.04 LTS"
#: ../lubuntu-calamares.desktop.in.h:2 #: ../lubuntu-calamares.desktop.in.h:2
msgid "Install Lubuntu" msgid "Install Lubuntu"

View File

@ -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.04" msgid "Install Lubuntu 24.04 LTS"
msgstr "" msgstr ""
#: ../lubuntu-calamares.desktop.in.h:2 #: ../lubuntu-calamares.desktop.in.h:2

View File

@ -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.04" msgid "Install Lubuntu 24.04 LTS"
msgstr "Instal·lar Lubuntu 25.04" msgstr "Instal·lar Lubuntu 24.04 LTS"
#: ../lubuntu-calamares.desktop.in.h:2 #: ../lubuntu-calamares.desktop.in.h:2
msgid "Install Lubuntu" msgid "Install Lubuntu"

Some files were not shown because too many files have changed in this diff Show More