Merge branch 'calamares' of https://github.com/calamares/calamares into development

This commit is contained in:
Philip Müller 2022-04-28 19:27:39 +07:00
commit d5a79180e7
28 changed files with 693 additions and 425 deletions

1
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1 @@
18fef8dfe5d926ec0bc979562553adf4db8db2e9

View File

@ -34,11 +34,13 @@ jobs:
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
message: |
OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}
- name: "notify: fail"
if: ${{ failure() && github.repository == 'calamares/calamares' }}
uses: calamares/actions/matrix-notify@v4
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
message: |
FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}

View File

@ -28,6 +28,22 @@ jobs:
- name: "build"
id: build
uses: calamares/actions/generic-build@v4
- name: "notify: ok"
if: ${{ success() && github.repository == 'calamares/calamares' }}
uses: calamares/actions/matrix-notify@v4
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: |
OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}
- name: "notify: fail"
if: ${{ failure() && github.repository == 'calamares/calamares' }}
uses: calamares/actions/matrix-notify@v4
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: |
FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}
- name: "Calamares: archive"
working-directory: ${{ env.BUILDDIR }}
run: |
@ -39,18 +55,4 @@ jobs:
name: calamares-tarball
path: ${{ env.BUILDDIR }}/calamares.tar.gz
if-no-files-found: error
retention-days: 3
- name: "notify: ok"
if: ${{ success() && github.repository == 'calamares/calamares' }}
uses: calamares/actions/matrix-notify@v4
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
- name: "notify: fail"
if: ${{ failure() && github.repository == 'calamares/calamares' }}
uses: calamares/actions/matrix-notify@v4
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
retention-days: 7

View File

@ -35,11 +35,12 @@ jobs:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: |
OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}
- name: "notify: fail"
if: ${{ failure() && github.repository == 'calamares/calamares' }}
uses: calamares/actions/matrix-notify@v4
with:
token: ${{ secrets.MATRIX_TOKEN }}
room: ${{ secrets.MATRIX_ROOM }}
message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}"
message: |
FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.build.outputs.git-summary }}

View File

@ -8,15 +8,41 @@ contributors are listed. Note that Calamares does not have a historical
changelog -- this log starts with version 3.2.0. The release notes on the
website will have to do for older versions.
# 3.2.56 (unreleased) #
# 3.2.57 (unreleased) #
This release contains contributions from (alphabetically by first name):
- Victor Fuentes (new contributor! Welcome!)
- Arjen Balfoort (new contributor! Welcome!)
- Victor Fuentes
## Core ##
- No core changes yet
## Modules ##
- *fstab* and *luksbootkeyfile* have better support for an **un**encrypted
`/boot` partition. #1931 (thanks Arjen)
- *packagechooser* and *packagechooserq* can now be given a custom name
in the side-panel. #1932 (thanks Victor)
# 3.2.56 (2022-04-22) #
As of this release, Calamares 3.2 development is winding down. The
reason is simple: systems where the backwards-compatibility of Calamares
3.2 is important are becoming increasingly difficult to work with
for **other** reasons. Foremost among these are deprecated versions
of dependencies and tools. Calamares 3.2 branch remains open for
bugfixes and will see a few more releases, but development is now
shifting wholesale to the newer generation.
This release contains contributions from (alphabetically by first name):
- Victor Fuentes (new contributor! Welcome!)
## Core ##
- Changes in git forced some changes on the CI tooling.
## Modules ##
- *locale* showed the wrong timezone for Dhaka, although it configured
the correct one. #1929
- *users* module sets global storage key *fullname* to the full name
of the user (e.g. what is entered in the "your full name" box on the
users page). #1923 (Thanks Victor)

View File

@ -41,7 +41,7 @@
# TODO:3.3: Require CMake 3.12
cmake_minimum_required( VERSION 3.3 FATAL_ERROR )
project( CALAMARES
VERSION 3.2.56
VERSION 3.2.57
LANGUAGES C CXX
)

View File

@ -862,52 +862,52 @@ The installer will quit and all changes will be lost.</translation>
<translation>&lt;h1&gt;Welcome to the %1 installer&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="217"/>
<location filename="../src/modules/users/Config.cpp" line="221"/>
<source>Your username is too long.</source>
<translation>Your username is too long.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="223"/>
<location filename="../src/modules/users/Config.cpp" line="227"/>
<source>'%1' is not allowed as username.</source>
<translation>'%1' is not allowed as username.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="230"/>
<location filename="../src/modules/users/Config.cpp" line="234"/>
<source>Your username must start with a lowercase letter or underscore.</source>
<translation>Your username must start with a lowercase letter or underscore.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="234"/>
<location filename="../src/modules/users/Config.cpp" line="238"/>
<source>Only lowercase letters, numbers, underscore and hyphen are allowed.</source>
<translation>Only lowercase letters, numbers, underscore and hyphen are allowed.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="279"/>
<location filename="../src/modules/users/Config.cpp" line="288"/>
<source>Your hostname is too short.</source>
<translation>Your hostname is too short.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="283"/>
<location filename="../src/modules/users/Config.cpp" line="292"/>
<source>Your hostname is too long.</source>
<translation>Your hostname is too long.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="289"/>
<location filename="../src/modules/users/Config.cpp" line="298"/>
<source>'%1' is not allowed as hostname.</source>
<translation>'%1' is not allowed as hostname.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="295"/>
<location filename="../src/modules/users/Config.cpp" line="304"/>
<source>Only letters, numbers, underscore and hyphen are allowed.</source>
<translation>Only letters, numbers, underscore and hyphen are allowed.</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="534"/>
<location filename="../src/modules/users/Config.cpp" line="573"/>
<source>Your passwords do not match!</source>
<translation>Your passwords do not match!</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="548"/>
<location filename="../src/modules/users/Config.cpp" line="587"/>
<source>OK!</source>
<translation>OK!</translation>
</message>
@ -2487,7 +2487,7 @@ The installer will quit and all changes will be lost.</translation>
<translation>Unknown error</translation>
</message>
<message>
<location filename="../src/modules/users/Config.cpp" line="782"/>
<location filename="../src/modules/users/Config.cpp" line="818"/>
<source>Password is empty</source>
<translation>Password is empty</translation>
</message>
@ -3421,29 +3421,29 @@ Output:
<context>
<name>SetHostNameJob</name>
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="37"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="36"/>
<source>Set hostname %1</source>
<translation>Set hostname %1</translation>
</message>
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="44"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="43"/>
<source>Set hostname &lt;strong&gt;%1&lt;/strong&gt;.</source>
<translation>Set hostname &lt;strong&gt;%1&lt;/strong&gt;.</translation>
</message>
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="51"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="50"/>
<source>Setting hostname %1.</source>
<translation>Setting hostname %1.</translation>
</message>
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="122"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="129"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="124"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="131"/>
<source>Internal Error</source>
<translation>Internal Error</translation>
</message>
<message>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="137"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="146"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="142"/>
<location filename="../src/modules/users/SetHostNameJob.cpp" line="159"/>
<source>Cannot write hostname to target system</source>
<translation>Cannot write hostname to target system</translation>
</message>
@ -3645,18 +3645,18 @@ Output:
<context>
<name>SetupGroupsJob</name>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="185"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="182"/>
<source>Preparing groups.</source>
<translation>Preparing groups.</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="197"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="202"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="194"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="199"/>
<source>Could not create groups in target system</source>
<translation>Could not create groups in target system</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="203"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="200"/>
<source>These groups are missing in the target system: %1</source>
<translation>These groups are missing in the target system: %1</translation>
</message>
@ -3669,12 +3669,12 @@ Output:
<translation>Configure &lt;pre&gt;sudo&lt;/pre&gt; users.</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="74"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="71"/>
<source>Cannot chmod sudoers file.</source>
<translation>Cannot chmod sudoers file.</translation>
</message>
<message>
<location filename="../src/modules/users/MiscJobs.cpp" line="79"/>
<location filename="../src/modules/users/MiscJobs.cpp" line="76"/>
<source>Cannot create sudoers file for writing.</source>
<translation>Cannot create sudoers file for writing.</translation>
</message>
@ -3877,12 +3877,12 @@ Output:
<context>
<name>UsersPage</name>
<message>
<location filename="../src/modules/users/UsersPage.cpp" line="177"/>
<location filename="../src/modules/users/UsersPage.cpp" line="190"/>
<source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after setup.&lt;/small&gt;</source>
<translation>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after setup.&lt;/small&gt;</translation>
</message>
<message>
<location filename="../src/modules/users/UsersPage.cpp" line="183"/>
<location filename="../src/modules/users/UsersPage.cpp" line="196"/>
<source>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after installation.&lt;/small&gt;</source>
<translation>&lt;small&gt;If more than one person will use this computer, you can create multiple accounts after installation.&lt;/small&gt;</translation>
</message>

View File

@ -338,12 +338,12 @@ Link copied to clipboard</source>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="189"/>
<source>Calamares Initialization Failed</source>
<translation> </translation>
<translation>Calamares </translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="190"/>
<source>%1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution.</source>
<translation>%1 . . .</translation>
<translation>%1 . Calamares . Calamares .</translation>
</message>
<message>
<location filename="../src/libcalamaresui/ViewManager.cpp" line="196"/>
@ -1127,7 +1127,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/CreatePartitionJob.cpp" line="280"/>
<source>The installer failed to create partition on disk '%1'.</source>
<translation> '%1' .</translation>
<translation> '%1' .</translation>
</message>
</context>
<context>
@ -1262,7 +1262,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp" line="46"/>
<source>The installer failed to deactivate a volume group named %1.</source>
<translation>%1 .</translation>
<translation> %1 .</translation>
</message>
</context>
<context>
@ -1672,7 +1672,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="205"/>
<source>has a screen large enough to show the whole installer</source>
<translation> </translation>
<translation> </translation>
</message>
<message>
<location filename="../src/modules/welcome/checker/GeneralRequirements.cpp" line="208"/>
@ -2835,17 +2835,17 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="254"/>
<source>Unsafe partition actions are enabled.</source>
<translation type="unfinished"/>
<translation> .</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="257"/>
<source>Partitioning is configured to &lt;b&gt;always&lt;/b&gt; fail.</source>
<translation type="unfinished"/>
<translation> &lt;b&gt;&lt;/b&gt; .</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="260"/>
<source>No partitions will be changed.</source>
<translation type="unfinished"/>
<translation> .</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="300"/>
@ -2905,7 +2905,7 @@ The installer will quit and all changes will be lost.</source>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="594"/>
<source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;%2&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source>
<translation type="unfinished"/>
<translation>GPT . BIOS .&lt;br/&gt;&lt;br/&gt;BIOS에서 GPT ( ) GPT로 &lt;strong&gt;%2&lt;/strong&gt; 플래그가 활성화된 8MB의 포맷되지 않은 파티션을 생성하십시오.&lt;br/&gt;&lt;br/&gt;GPT가 BIOS %1() 8MB .</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="626"/>
@ -3287,7 +3287,7 @@ Output:
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="175"/>
<source>Calamares cannot start KPMCore for the file-system resize job.</source>
<translation> KPMCore를 .</translation>
<translation>Calamares KPMCore를 .</translation>
</message>
<message>
<location filename="../src/modules/fsresizer/ResizeFSJob.cpp" line="183"/>
@ -3791,7 +3791,7 @@ Output:
<message>
<location filename="../src/modules/tracking/TrackingJobs.cpp" line="176"/>
<source>Could not configure machine feedback correctly, Calamares error %1.</source>
<translation> , %1 .</translation>
<translation> , Calamares의 %1 .</translation>
</message>
</context>
<context>
@ -4021,7 +4021,7 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="216"/>
<source>&lt;h1&gt;Welcome to the Calamares setup program for %1.&lt;/h1&gt;</source>
<translation>&lt;h1&gt;%1 .&lt;/h1&gt;</translation>
<translation>&lt;h1&gt;%1Calamares .&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="217"/>
@ -4031,7 +4031,7 @@ Output:
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="222"/>
<source>&lt;h1&gt;Welcome to the Calamares installer for %1.&lt;/h1&gt;</source>
<translation>&lt;h1&gt;%1 .&lt;/h1&gt;</translation>
<translation>&lt;h1&gt;%1Calamares .&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcome/WelcomePage.cpp" line="223"/>
@ -4095,7 +4095,7 @@ Output:
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="181"/>
<source>No partitions are available for ZFS.</source>
<translation>ZFS에 .</translation>
<translation> ZFS로 .</translation>
</message>
<message>
<location filename="../src/modules/zfs/ZfsJob.cpp" line="192"/>
@ -4525,7 +4525,7 @@ Output:
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="66"/>
<source>About</source>
<translation></translation>
<translation>Calamares</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="80"/>

View File

@ -2850,17 +2850,17 @@ Sistem güç kaynağına bağlı değil.</translation>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="254"/>
<source>Unsafe partition actions are enabled.</source>
<translation type="unfinished"/>
<translation>Güvenli olmayan bölümleme eylemi etkinleştirildi.</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="257"/>
<source>Partitioning is configured to &lt;b&gt;always&lt;/b&gt; fail.</source>
<translation type="unfinished"/>
<translation>Bölümleme, &lt;b&gt;her zaman&lt;/b&gt; başarısız olacak şekilde yapılandırılmıştır.</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="260"/>
<source>No partitions will be changed.</source>
<translation type="unfinished"/>
<translation>Hiçbir bölüm değiştirilmeyecek.</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="300"/>
@ -2920,7 +2920,7 @@ Sistem güç kaynağına bağlı değil.</translation>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="594"/>
<source>A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.&lt;br/&gt;&lt;br/&gt;To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the &lt;strong&gt;%2&lt;/strong&gt; flag enabled.&lt;br/&gt;&lt;br/&gt;An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT.</source>
<translation type="unfinished"/>
<translation>GPT bölüm tablosu, tüm sistemler için en iyi seçenektir. Bu yükleyici, BIOS sistemleri için de böyle bir kurulumu destekler. &lt;br/&gt;&lt;br/&gt;BIOS'ta bir GPT bölüm tablosu yapılandırmak için (önceden yapılmadıysa) geri dönün ve bölüm tablosunu GPT olarak ayarlayın, ardından &lt;strong&gt;%2&lt;/strong&gt; bayrağı etkinleştirilmiş.&lt;br/&gt;&lt;br/&gt; 8 MB biçimlendirilmemiş bölüm oluşturun .GPT' ile BIOS sisteminde %1 başlatmak için biçimlendirilmemiş 8 MB bir bölüm gereklidir.</translation>
</message>
<message>
<location filename="../src/modules/partition/PartitionViewStep.cpp" line="626"/>

View File

@ -2,426 +2,403 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-03-21 17:21+0100\n"
"POT-Creation-Date: 2022-04-22 11:03+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
msgstr "Configuring initramfs."
#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
#: src/modules/fstab/main.py:361 src/modules/fstab/main.py:367
#: src/modules/fstab/main.py:394 src/modules/networkcfg/main.py:105
#: src/modules/initcpiocfg/main.py:235 src/modules/initcpiocfg/main.py:239
#: src/modules/localecfg/main.py:135 src/modules/mount/main.py:229
#: src/modules/rawfs/main.py:164 src/modules/openrcdmcryptcfg/main.py:72
#: src/modules/openrcdmcryptcfg/main.py:76
msgid "Configuration Error"
msgstr "Configuration Error"
#: src/modules/initramfscfg/main.py:86 src/modules/fstab/main.py:362
#: src/modules/initcpiocfg/main.py:236 src/modules/mount/main.py:230
#: src/modules/rawfs/main.py:165 src/modules/openrcdmcryptcfg/main.py:73
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr "No partitions are defined for <pre>{!s}</pre> to use."
#: src/modules/initramfscfg/main.py:90 src/modules/fstab/main.py:368
#: src/modules/networkcfg/main.py:106 src/modules/initcpiocfg/main.py:240
#: src/modules/localecfg/main.py:136 src/modules/openrcdmcryptcfg/main.py:77
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr "No root mount point is given for <pre>{!s}</pre> to use."
#: src/modules/grubcfg/main.py:28
msgid "Configure GRUB."
msgstr "Configure GRUB."
#: src/modules/bootloader/main.py:43
msgid "Install bootloader."
msgstr "Install bootloader."
#: src/modules/bootloader/main.py:614
msgid "Failed to install grub, no partitions defined in global storage"
msgstr "Failed to install grub, no partitions defined in global storage"
#: src/modules/bootloader/main.py:782
msgid "Bootloader installation error"
msgstr "Bootloader installation error"
#: src/modules/bootloader/main.py:783
msgid ""
"The bootloader could not be installed. The installation command "
"<pre>{!s}</pre> returned error code {!s}."
msgstr ""
"The bootloader could not be installed. The installation command "
"<pre>{!s}</pre> returned error code {!s}."
#: src/modules/fstab/main.py:29
msgid "Writing fstab."
msgstr "Writing fstab."
#: src/modules/fstab/main.py:395
msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
msgstr "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
#: src/modules/dracut/main.py:27
msgid "Creating initramfs with dracut."
msgstr "Creating initramfs with dracut."
#: src/modules/dracut/main.py:49
msgid "Failed to run dracut on the target"
msgstr "Failed to run dracut on the target"
#: src/modules/dracut/main.py:50 src/modules/mkinitfs/main.py:50
msgid "The exit code was {}"
msgstr "The exit code was {}"
#: src/modules/displaymanager/main.py:524
msgid "Cannot write KDM configuration file"
msgstr "Cannot write KDM configuration file"
#: src/modules/displaymanager/main.py:525
msgid "KDM config file {!s} does not exist"
msgstr "KDM config file {!s} does not exist"
#: src/modules/displaymanager/main.py:586
msgid "Cannot write LXDM configuration file"
msgstr "Cannot write LXDM configuration file"
#: src/modules/displaymanager/main.py:587
msgid "LXDM config file {!s} does not exist"
msgstr "LXDM config file {!s} does not exist"
#: src/modules/displaymanager/main.py:670
msgid "Cannot write LightDM configuration file"
msgstr "Cannot write LightDM configuration file"
#: src/modules/displaymanager/main.py:671
msgid "LightDM config file {!s} does not exist"
msgstr "LightDM config file {!s} does not exist"
#: src/modules/displaymanager/main.py:745
msgid "Cannot configure LightDM"
msgstr "Cannot configure LightDM"
#: src/modules/displaymanager/main.py:746
msgid "No LightDM greeter installed."
msgstr "No LightDM greeter installed."
#: src/modules/displaymanager/main.py:777
msgid "Cannot write SLIM configuration file"
msgstr "Cannot write SLIM configuration file"
#: src/modules/displaymanager/main.py:778
msgid "SLIM config file {!s} does not exist"
msgstr "SLIM config file {!s} does not exist"
#: src/modules/displaymanager/main.py:991
msgid "No display managers selected for the displaymanager module."
msgstr "No display managers selected for the displaymanager module."
#: src/modules/displaymanager/main.py:992
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
#: src/modules/displaymanager/main.py:1074
msgid "Display manager configuration was incomplete"
msgstr "Display manager configuration was incomplete"
#: src/modules/services-openrc/main.py:29
msgid "Configure OpenRC services"
msgstr "Configure OpenRC services"
#: src/modules/services-openrc/main.py:57
msgid "Cannot add service {name!s} to run-level {level!s}."
msgstr "Cannot add service {name!s} to run-level {level!s}."
#: src/modules/services-openrc/main.py:59
msgid "Cannot remove service {name!s} from run-level {level!s}."
msgstr "Cannot remove service {name!s} from run-level {level!s}."
#: src/modules/services-openrc/main.py:61
msgid ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
msgstr ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
#: src/modules/services-openrc/main.py:93
#: src/modules/services-systemd/main.py:59
msgid "Cannot modify service"
msgstr "Cannot modify service"
#: src/modules/services-openrc/main.py:94
msgid ""
"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
msgstr ""
"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
#: src/modules/services-openrc/main.py:101
msgid "Target runlevel does not exist"
msgstr "Target runlevel does not exist"
#: src/modules/services-openrc/main.py:102
msgid ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
#: src/modules/services-openrc/main.py:110
msgid "Target service does not exist"
msgstr "Target service does not exist"
#: src/modules/services-openrc/main.py:111
msgid ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
"The path for service {name!s} is <code>{path!s}</code>, which does not "
"exist."
#: src/modules/networkcfg/main.py:29
msgid "Saving network configuration."
msgstr "Saving network configuration."
#: src/modules/packages/main.py:54 src/modules/packages/main.py:65
#: src/modules/packages/main.py:75
msgid "Install packages."
msgstr "Install packages."
#: src/modules/packages/main.py:63
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr "Processing packages (%(count)d / %(total)d)"
#: src/modules/packages/main.py:68
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] "Installing one package."
msgstr[1] "Installing %(num)d packages."
#: src/modules/packages/main.py:71
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] "Removing one package."
msgstr[1] "Removing %(num)d packages."
#: src/modules/packages/main.py:725 src/modules/packages/main.py:737
#: src/modules/packages/main.py:765
msgid "Package Manager error"
msgstr "Package Manager error"
#: src/modules/packages/main.py:726
msgid ""
"The package manager could not prepare updates. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
"The package manager could not prepare updates. The command <pre>{!s}</pre> "
"returned error code {!s}."
#: src/modules/packages/main.py:738
msgid ""
"The package manager could not update the system. The command <pre>{!s}</pre>"
" returned error code {!s}."
msgstr ""
"The package manager could not update the system. The command <pre>{!s}</pre>"
" returned error code {!s}."
#: src/modules/packages/main.py:766
msgid ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."
msgstr ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."
#: src/modules/plymouthcfg/main.py:27
msgid "Configure Plymouth theme"
msgstr "Configure Plymouth theme"
#: src/modules/initcpiocfg/main.py:28
msgid "Configuring mkinitcpio."
msgstr "Configuring mkinitcpio."
#: src/modules/localecfg/main.py:30
msgid "Configuring locales."
msgstr "Configuring locales."
#: src/modules/mount/main.py:42
msgid "Mounting partitions."
msgstr "Mounting partitions."
msgstr ""
#: src/modules/mount/main.py:88 src/modules/mount/main.py:124
msgid "Internal error mounting zfs datasets"
msgstr "Internal error mounting zfs datasets"
msgstr ""
#: src/modules/mount/main.py:100
msgid "Failed to import zpool"
msgstr "Failed to import zpool"
msgstr ""
#: src/modules/mount/main.py:116
msgid "Failed to unlock zpool"
msgstr "Failed to unlock zpool"
msgstr ""
#: src/modules/mount/main.py:133 src/modules/mount/main.py:138
msgid "Failed to set zfs mountpoint"
msgstr "Failed to set zfs mountpoint"
msgstr ""
#: src/modules/mount/main.py:229 src/modules/initcpiocfg/main.py:235
#: src/modules/initcpiocfg/main.py:239 src/modules/rawfs/main.py:164
#: src/modules/initramfscfg/main.py:85 src/modules/initramfscfg/main.py:89
#: src/modules/openrcdmcryptcfg/main.py:72
#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/fstab/main.py:361
#: src/modules/fstab/main.py:367 src/modules/fstab/main.py:394
#: src/modules/localecfg/main.py:140 src/modules/networkcfg/main.py:105
msgid "Configuration Error"
msgstr ""
#: src/modules/mount/main.py:230 src/modules/initcpiocfg/main.py:236
#: src/modules/rawfs/main.py:165 src/modules/initramfscfg/main.py:86
#: src/modules/openrcdmcryptcfg/main.py:73 src/modules/fstab/main.py:362
msgid "No partitions are defined for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/mount/main.py:253
msgid "zfs mounting error"
msgstr "zfs mounting error"
#: src/modules/rawfs/main.py:26
msgid "Installing data."
msgstr "Installing data."
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr "Dummy python job."
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
#: src/modules/dummypython/main.py:94
msgid "Dummy python step {}"
msgstr "Dummy python step {}"
#: src/modules/hwclock/main.py:26
msgid "Setting hardware clock."
msgstr "Setting hardware clock."
#: src/modules/openrcdmcryptcfg/main.py:26
msgid "Configuring OpenRC dmcrypt service."
msgstr "Configuring OpenRC dmcrypt service."
msgstr ""
#: src/modules/services-systemd/main.py:26
msgid "Configure systemd services"
msgstr "Configure systemd services"
msgstr ""
#: src/modules/services-systemd/main.py:59
#: src/modules/services-openrc/main.py:93
msgid "Cannot modify service"
msgstr ""
#: src/modules/services-systemd/main.py:60
msgid ""
"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
msgstr ""
"<code>systemctl {arg!s}</code> call in chroot returned error code {num!s}."
#: src/modules/services-systemd/main.py:63
#: src/modules/services-systemd/main.py:69
msgid "Cannot enable systemd service <code>{name!s}</code>."
msgstr "Cannot enable systemd service <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:65
msgid "Cannot enable systemd target <code>{name!s}</code>."
msgstr "Cannot enable systemd target <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:67
msgid "Cannot enable systemd timer <code>{name!s}</code>."
msgstr "Cannot enable systemd timer <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:71
msgid "Cannot disable systemd target <code>{name!s}</code>."
msgstr "Cannot disable systemd target <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:73
msgid "Cannot mask systemd unit <code>{name!s}</code>."
msgstr "Cannot mask systemd unit <code>{name!s}</code>."
msgstr ""
#: src/modules/services-systemd/main.py:75
msgid ""
"Unknown systemd commands <code>{command!s}</code> and "
"<code>{suffix!s}</code> for unit {name!s}."
"Unknown systemd commands <code>{command!s}</code> and <code>{suffix!s}</"
"code> for unit {name!s}."
msgstr ""
"Unknown systemd commands <code>{command!s}</code> and "
"<code>{suffix!s}</code> for unit {name!s}."
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr "Creating initramfs with mkinitfs."
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr "Failed to run mkinitfs on the target"
#: src/modules/unpackfs/main.py:34
msgid "Filling up filesystems."
msgstr "Filling up filesystems."
msgstr ""
#: src/modules/unpackfs/main.py:254
msgid "rsync failed with error code {}."
msgstr "rsync failed with error code {}."
msgstr ""
#: src/modules/unpackfs/main.py:299
msgid "Unpacking image {}/{}, file {}/{}"
msgstr "Unpacking image {}/{}, file {}/{}"
msgstr ""
#: src/modules/unpackfs/main.py:314
msgid "Starting to unpack {}"
msgstr "Starting to unpack {}"
msgstr ""
#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467
msgid "Failed to unpack image \"{}\""
msgstr "Failed to unpack image \"{}\""
msgstr ""
#: src/modules/unpackfs/main.py:430
msgid "No mount point for root partition"
msgstr "No mount point for root partition"
msgstr ""
#: src/modules/unpackfs/main.py:431
msgid "globalstorage does not contain a \"rootMountPoint\" key."
msgstr "globalstorage does not contain a \"rootMountPoint\" key."
msgstr ""
#: src/modules/unpackfs/main.py:434
msgid "Bad mount point for root partition"
msgstr "Bad mount point for root partition"
msgstr ""
#: src/modules/unpackfs/main.py:435
msgid "rootMountPoint is \"{}\", which does not exist."
msgstr "rootMountPoint is \"{}\", which does not exist."
msgstr ""
#: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455
#: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465
#: src/modules/unpackfs/main.py:480
msgid "Bad unpackfs configuration"
msgstr "Bad unpackfs configuration"
msgstr ""
#: src/modules/unpackfs/main.py:440
msgid "There is no configuration information."
msgstr "There is no configuration information."
msgstr ""
#: src/modules/unpackfs/main.py:456
msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr "The filesystem for \"{}\" ({}) is not supported by your current kernel"
msgstr ""
#: src/modules/unpackfs/main.py:460
msgid "The source filesystem \"{}\" does not exist"
msgstr "The source filesystem \"{}\" does not exist"
msgstr ""
#: src/modules/unpackfs/main.py:466
msgid ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed."
msgstr ""
"Failed to find unsquashfs, make sure you have the squashfs-tools package "
"installed."
#: src/modules/unpackfs/main.py:481
msgid "The destination \"{}\" in the target system is not a directory"
msgstr "The destination \"{}\" in the target system is not a directory"
msgstr ""
#: src/modules/displaymanager/main.py:524
msgid "Cannot write KDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:525
msgid "KDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:586
msgid "Cannot write LXDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:587
msgid "LXDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:670
msgid "Cannot write LightDM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:671
msgid "LightDM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:745
msgid "Cannot configure LightDM"
msgstr ""
#: src/modules/displaymanager/main.py:746
msgid "No LightDM greeter installed."
msgstr ""
#: src/modules/displaymanager/main.py:777
msgid "Cannot write SLIM configuration file"
msgstr ""
#: src/modules/displaymanager/main.py:778
msgid "SLIM config file {!s} does not exist"
msgstr ""
#: src/modules/displaymanager/main.py:991
msgid "No display managers selected for the displaymanager module."
msgstr ""
#: src/modules/displaymanager/main.py:992
msgid ""
"The displaymanagers list is empty or undefined in both globalstorage and "
"displaymanager.conf."
msgstr ""
#: src/modules/displaymanager/main.py:1074
msgid "Display manager configuration was incomplete"
msgstr ""
#: src/modules/initcpiocfg/main.py:28
msgid "Configuring mkinitcpio."
msgstr ""
#: src/modules/initcpiocfg/main.py:240 src/modules/initramfscfg/main.py:90
#: src/modules/openrcdmcryptcfg/main.py:77 src/modules/fstab/main.py:368
#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:106
msgid "No root mount point is given for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/rawfs/main.py:26
msgid "Installing data."
msgstr ""
#: src/modules/services-openrc/main.py:29
msgid "Configure OpenRC services"
msgstr ""
#: src/modules/services-openrc/main.py:57
msgid "Cannot add service {name!s} to run-level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:59
msgid "Cannot remove service {name!s} from run-level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:61
msgid ""
"Unknown service-action <code>{arg!s}</code> for service {name!s} in run-"
"level {level!s}."
msgstr ""
#: src/modules/services-openrc/main.py:94
msgid ""
"<code>rc-update {arg!s}</code> call in chroot returned error code {num!s}."
msgstr ""
#: src/modules/services-openrc/main.py:101
msgid "Target runlevel does not exist"
msgstr ""
#: src/modules/services-openrc/main.py:102
msgid ""
"The path for runlevel {level!s} is <code>{path!s}</code>, which does not "
"exist."
msgstr ""
#: src/modules/services-openrc/main.py:110
msgid "Target service does not exist"
msgstr ""
#: src/modules/services-openrc/main.py:111
msgid ""
"The path for service {name!s} is <code>{path!s}</code>, which does not exist."
msgstr ""
#: src/modules/plymouthcfg/main.py:27
msgid "Configure Plymouth theme"
msgstr ""
#: src/modules/packages/main.py:54 src/modules/packages/main.py:65
#: src/modules/packages/main.py:75
msgid "Install packages."
msgstr ""
#: src/modules/packages/main.py:63
#, python-format
msgid "Processing packages (%(count)d / %(total)d)"
msgstr ""
#: src/modules/packages/main.py:68
#, python-format
msgid "Installing one package."
msgid_plural "Installing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
#: src/modules/packages/main.py:71
#, python-format
msgid "Removing one package."
msgid_plural "Removing %(num)d packages."
msgstr[0] ""
msgstr[1] ""
#: src/modules/packages/main.py:725 src/modules/packages/main.py:737
#: src/modules/packages/main.py:765
msgid "Package Manager error"
msgstr ""
#: src/modules/packages/main.py:726
msgid ""
"The package manager could not prepare updates. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
#: src/modules/packages/main.py:738
msgid ""
"The package manager could not update the system. The command <pre>{!s}</pre> "
"returned error code {!s}."
msgstr ""
#: src/modules/packages/main.py:766
msgid ""
"The package manager could not make changes to the installed system. The "
"command <pre>{!s}</pre> returned error code {!s}."
msgstr ""
#: src/modules/bootloader/main.py:43
msgid "Install bootloader."
msgstr ""
#: src/modules/bootloader/main.py:614
msgid "Failed to install grub, no partitions defined in global storage"
msgstr ""
#: src/modules/bootloader/main.py:782
msgid "Bootloader installation error"
msgstr ""
#: src/modules/bootloader/main.py:783
msgid ""
"The bootloader could not be installed. The installation command <pre>{!s}</"
"pre> returned error code {!s}."
msgstr ""
#: src/modules/hwclock/main.py:26
msgid "Setting hardware clock."
msgstr ""
#: src/modules/mkinitfs/main.py:27
msgid "Creating initramfs with mkinitfs."
msgstr ""
#: src/modules/mkinitfs/main.py:49
msgid "Failed to run mkinitfs on the target"
msgstr ""
#: src/modules/mkinitfs/main.py:50 src/modules/dracut/main.py:50
msgid "The exit code was {}"
msgstr ""
#: src/modules/dracut/main.py:27
msgid "Creating initramfs with dracut."
msgstr ""
#: src/modules/dracut/main.py:49
msgid "Failed to run dracut on the target"
msgstr ""
#: src/modules/initramfscfg/main.py:32
msgid "Configuring initramfs."
msgstr ""
#: src/modules/openrcdmcryptcfg/main.py:26
msgid "Configuring OpenRC dmcrypt service."
msgstr ""
#: src/modules/fstab/main.py:29
msgid "Writing fstab."
msgstr ""
#: src/modules/fstab/main.py:395
msgid "No <pre>{!s}</pre> configuration is given for <pre>{!s}</pre> to use."
msgstr ""
#: src/modules/dummypython/main.py:35
msgid "Dummy python job."
msgstr ""
#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:93
#: src/modules/dummypython/main.py:94
msgid "Dummy python step {}"
msgstr ""
#: src/modules/localecfg/main.py:31
msgid "Configuring locales."
msgstr ""
#: src/modules/networkcfg/main.py:29
msgid "Saving network configuration."
msgstr ""

View File

@ -5,7 +5,7 @@
#
# Translators:
# Ji-Hyeon Gim <potatogim@potatogim.net>, 2018
# Junghee Lee <daemul72@gmail.com>, 2022
# JungHee Lee <daemul72@gmail.com>, 2022
#
#, fuzzy
msgid ""
@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-03-21 17:21+0100\n"
"PO-Revision-Date: 2017-08-09 10:34+0000\n"
"Last-Translator: Junghee Lee <daemul72@gmail.com>, 2022\n"
"Last-Translator: JungHee Lee <daemul72@gmail.com>, 2022\n"
"Language-Team: Korean (https://www.transifex.com/calamares/teams/20061/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -58,7 +58,7 @@ msgstr "부트로더 설치."
#: src/modules/bootloader/main.py:614
msgid "Failed to install grub, no partitions defined in global storage"
msgstr "grub을 설치하지 못했습니다. 전역 저장소에 파티션이 정의되어 있지 않습니다"
msgstr "grub을 설치하지 못했습니다. 파티션 없음이 전역 저장소에 정의되었습니다"
#: src/modules/bootloader/main.py:782
msgid "Bootloader installation error"

28
src/modules/fstab/main.py Normal file → Executable file
View File

@ -158,11 +158,23 @@ class FstabGenerator(object):
if not mapper_name or not luks_uuid:
return None
password = "/crypto_keyfile.bin"
crypttab_options = self.crypttab_options
# Set crypttab password for partition to none and remove crypttab options
# on root partition when /boot is unencrypted
if partition["mountPoint"] == "/":
if any([p["mountPoint"] == "/boot"
and "luksMapperName" not in p
for p in self.partitions]):
password = "none"
crypttab_options = ""
return dict(
name=mapper_name,
device="UUID=" + luks_uuid,
password="/crypto_keyfile.bin",
options=self.crypttab_options,
password=password,
options=crypttab_options,
)
def print_crypttab_line(self, dct, file=None):
@ -220,7 +232,7 @@ class FstabGenerator(object):
# Some "fs" names need special handling in /etc/fstab, so remap them.
filesystem = partition["fs"].lower()
filesystem = FS_MAP.get(filesystem, filesystem)
has_luks = "luksMapperName" in partition
luks_mapper_name = partition.get("luksMapperName", None)
mount_point = partition["mountPoint"]
disk_name = disk_name_for_partition(partition)
is_ssd = disk_name in self.ssd_disks
@ -263,13 +275,19 @@ class FstabGenerator(object):
if filesystem == "btrfs" and partition.get("subvol",None):
options = "subvol={},".format(partition["subvol"]) + options
if has_luks:
device = "/dev/mapper/" + partition["luksMapperName"]
device = None
if luks_mapper_name:
device = "/dev/mapper/" + luks_mapper_name
elif partition["uuid"]:
device = "UUID=" + partition["uuid"]
else:
device = partition["device"]
if not device:
# TODO: we get here when the user mounted a previously encrypted partition
# This should be catched early in the process
return None
return dict(device=device,
mount_point=mount_point,
fs=filesystem,

View File

@ -1,6 +1,6 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2020 - 2021 Anke Boersma <demm@kaosx.us>
* SPDX-FileCopyrightText: 2020 - 2022 Anke Boersma <demm@kaosx.us>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
@ -137,6 +137,7 @@ Item {
hoverEnabled: true
width: parent.width
height: 18
highlighted: ListView.isCurrentItem
RowLayout {
@ -216,6 +217,7 @@ Item {
delegate: ItemDelegate {
hoverEnabled: true
width: parent.width
height: 18
highlighted: ListView.isCurrentItem
RowLayout {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -17,6 +17,7 @@ import os
import re
import shutil
import libcalamares
import gettext
@ -71,8 +72,12 @@ def rewrite_locale_gen(srcfilename, destfilename, locale_conf):
# Get entire source-file contents
text = []
with open(srcfilename, "r") as gen:
text = gen.readlines()
try:
with open(srcfilename, "r") as gen:
text = gen.readlines()
except FileNotFoundError:
# That's ok, the file doesn't exist so assume empty
pass
# we want unique values, so locale_values should have 1 or 2 items
locale_values = set(locale_conf.values())

View File

@ -1,6 +1,6 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2020-2021 Anke Boersma <demm@kaosx.us>
* SPDX-FileCopyrightText: 2020-2022 Anke Boersma <demm@kaosx.us>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
@ -72,6 +72,7 @@ Page {
hoverEnabled: true
width: parent.width
height: 30
highlighted: ListView.isCurrentItem
Label {
@ -146,6 +147,7 @@ Page {
hoverEnabled: true
width: parent.width
height: 30
highlighted: ListView.isCurrentItem
Label {

View File

@ -3,7 +3,7 @@
# SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
#
calamares_add_plugin( luksbootkeyfile
calamares_add_plugin(luksbootkeyfile
TYPE job
EXPORT_MACRO PLUGINDLLEXPORT_PRO
SOURCES
@ -11,3 +11,10 @@ calamares_add_plugin( luksbootkeyfile
SHARED_LIB
NO_CONFIG
)
calamares_add_test(
luksbootkeyfiletest
SOURCES
Tests.cpp
LuksBootKeyFileJob.cpp
)

View File

@ -150,26 +150,50 @@ setupLuks( const LuksDevice& d )
}
static QVariantList
partitions()
partitionsFromGlobalStorage()
{
Calamares::GlobalStorage* globalStorage = Calamares::JobQueue::instance()->globalStorage();
return globalStorage->value( QStringLiteral( "partitions" ) ).toList();
}
static bool
/// Checks if the partition (represented by @p map) mounts to the given @p path
STATICTEST bool
hasMountPoint( const QVariantMap& map, const QString& path )
{
const auto v = map.value( QStringLiteral( "mountPoint" ) );
return v.isValid() && QDir::cleanPath( v.toString() ) == path;
}
STATICTEST bool
isEncrypted( const QVariantMap& map )
{
return map.contains( QStringLiteral( "luksMapperName" ) );
}
/// Checks for any partition satisfying @p pred
STATICTEST bool
anyPartition( bool ( *pred )( const QVariantMap& ) )
{
const auto partitions = partitionsFromGlobalStorage();
return std::find_if( partitions.cbegin(),
partitions.cend(),
[ &pred ]( const QVariant& partitionVariant ) { return pred( partitionVariant.toMap() ); } )
!= partitions.cend();
}
STATICTEST bool
hasUnencryptedSeparateBoot()
{
const QVariantList partitions = ::partitions();
for ( const QVariant& partition : partitions )
{
QVariantMap partitionMap = partition.toMap();
QString mountPoint = partitionMap.value( QStringLiteral( "mountPoint" ) ).toString();
if ( QDir::cleanPath( mountPoint ) == QStringLiteral( "/boot" ) )
{
return !partitionMap.contains( QStringLiteral( "luksMapperName" ) );
}
}
return false;
return anyPartition(
[]( const QVariantMap& partition )
{ return hasMountPoint( partition, QStringLiteral( "/boot" ) ) && !isEncrypted( partition ); } );
}
STATICTEST bool
hasEncryptedRoot()
{
return anyPartition( []( const QVariantMap& partition )
{ return hasMountPoint( partition, QStringLiteral( "/" ) ) && isEncrypted( partition ); } );
}
Calamares::JobResult
@ -218,7 +242,8 @@ LuksBootKeyFileJob::exec()
}
// /boot partition is not encrypted, keyfile must not be used
if ( hasUnencryptedSeparateBoot() )
// But only if root partition is not encrypted
if ( hasUnencryptedSeparateBoot() && !hasEncryptedRoot() )
{
cDebug() << Logger::SubEntry << "/boot partition is not encrypted, skipping keyfile creation.";
return Calamares::JobResult::ok();
@ -241,6 +266,12 @@ LuksBootKeyFileJob::exec()
for ( const auto& d : s.devices )
{
// Skip setupLuks for root partition if system has an unencrypted /boot
if ( d.isRoot && hasUnencryptedSeparateBoot() )
{
continue;
}
if ( !setupLuks( d ) )
return Calamares::JobResult::error(
tr( "Encrypted rootfs setup error" ),

View File

@ -0,0 +1,169 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2022 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
#include "GlobalStorage.h"
#include "JobQueue.h"
#include "utils/Logger.h"
#include <QtTest/QtTest>
#undef STATICTEST
#define STATICTEST extern
// Implementation details
STATICTEST bool hasMountPoint( const QVariantMap& map, const QString& path );
STATICTEST bool isEncrypted( const QVariantMap& map );
STATICTEST bool anyPartition( bool ( *pred )( const QVariantMap& ) );
STATICTEST bool hasUnencryptedSeparateBoot();
STATICTEST bool hasEncryptedRoot();
class LuksBootKeyFileTests : public QObject
{
Q_OBJECT
public:
LuksBootKeyFileTests() {}
~LuksBootKeyFileTests() override {}
private Q_SLOTS:
void initTestCase();
void testMountPoint();
void testIsEncrypted();
void testAnyPartition();
};
void
LuksBootKeyFileTests::initTestCase()
{
Logger::setupLogLevel( Logger::LOGDEBUG );
cDebug() << "LuksBootKeyFile test started.";
if ( !Calamares::JobQueue::instance() )
{
(void)new Calamares::JobQueue();
}
}
void
LuksBootKeyFileTests::testMountPoint()
{
QVariantMap m; // As if this is a partition data
const QString key = QStringLiteral( "mountPoint" );
const QString boot = QStringLiteral( "/boot" );
const QString root = QStringLiteral( "/" );
QVERIFY( !hasMountPoint( m, QString() ) );
QVERIFY( !hasMountPoint( m, boot ) );
m.insert( key, boot );
QVERIFY( hasMountPoint( m, boot ) );
QVERIFY( !hasMountPoint( m, QString() ) );
QVERIFY( !hasMountPoint( m, root ) );
m.insert( key, root );
QVERIFY( !hasMountPoint( m, boot ) );
QVERIFY( !hasMountPoint( m, QString() ) );
QVERIFY( hasMountPoint( m, root ) );
m.remove( key );
QVERIFY( !hasMountPoint( m, root ) );
}
void
LuksBootKeyFileTests::testIsEncrypted()
{
QVariantMap m; // As if this is a partition data
const QString key = QStringLiteral( "luksMapperName" );
const QString name = QStringLiteral( "any-name" );
QVERIFY( !isEncrypted( m ) );
// Even an empty string is considered encrypted
m.insert( key, QString() );
QVERIFY( isEncrypted( m ) );
m.insert( key, name );
QVERIFY( isEncrypted( m ) );
m.insert( key, QString() );
QVERIFY( isEncrypted( m ) );
m.remove( key );
QVERIFY( !isEncrypted( m ) );
}
void
LuksBootKeyFileTests::testAnyPartition()
{
// This is kind of annoying: we need to build up
// partition data in GS because the functions we're testing
// go straight to GS.
auto* gs = Calamares::JobQueue::instanceGlobalStorage();
QVERIFY( gs );
const QString partitionsKey = QStringLiteral( "partitions" );
const QString mountPointKey = QStringLiteral( "mountPoint" );
const QString boot = QStringLiteral( "/boot" );
const QString root = QStringLiteral( "/" );
QVariantList partitions;
QVariantMap p;
QVERIFY( !gs->contains( partitionsKey ) );
// Empty list!
QVERIFY( !anyPartition( []( const QVariantMap& ) { return true; } ) );
gs->insert( partitionsKey, partitions );
QVERIFY( !anyPartition( []( const QVariantMap& ) { return true; } ) ); // Still an empty list
partitions.append( p );
QCOMPARE( partitions.count(), 1 );
gs->insert( partitionsKey, partitions );
QVERIFY( anyPartition( []( const QVariantMap& ) { return true; } ) ); // Now a one-element list
QVERIFY( !anyPartition( []( const QVariantMap& ) { return false; } ) ); // Now a one-element list
p.insert( mountPointKey, boot );
QVERIFY( hasMountPoint( p, boot ) );
partitions.append( p );
QCOMPARE( partitions.count(), 2 );
// Note that GS is not updated yet, so we expect this to fail
QEXPECT_FAIL( "", "GS not updated", Continue );
QVERIFY( anyPartition(
[]( const QVariantMap& partdata )
{
cDebug() << partdata;
return hasMountPoint( partdata, QStringLiteral( "/boot" ) );
} ) );
gs->insert( partitionsKey, partitions ); // Update GS
QVERIFY( anyPartition(
[]( const QVariantMap& partdata )
{
cDebug() << partdata;
return hasMountPoint( partdata, QStringLiteral( "/boot" ) );
} ) );
QVERIFY( !anyPartition( []( const QVariantMap& partdata )
{ return hasMountPoint( partdata, QStringLiteral( "/" ) ); } ) );
QVERIFY( !anyPartition( []( const QVariantMap& partdata ) { return hasMountPoint( partdata, QString() ); } ) );
QVERIFY( !hasEncryptedRoot() );
QVERIFY( hasUnencryptedSeparateBoot() );
}
QTEST_GUILESS_MAIN( LuksBootKeyFileTests )
#include "utils/moc-warnings.h"
#include "Tests.moc"

View File

@ -237,6 +237,12 @@ Config::setPackageChoice( const QString& packageChoice )
emit packageChoiceChanged( m_packageChoice.value_or( QString() ) );
}
QString
Config::prettyName() const
{
return m_stepName ? m_stepName->get() : tr( "Packages" );
}
QString
Config::prettyStatus() const
{
@ -343,4 +349,14 @@ Config::setConfigurationMap( const QVariantMap& configurationMap )
cWarning() << "Single-selection QML module must use 'Legacy' method.";
}
}
bool labels_ok = false;
auto labels = CalamaresUtils::getSubMap( configurationMap, "labels", labels_ok );
if ( labels_ok )
{
if ( labels.contains( "step" ) )
{
m_stepName = new CalamaresUtils::Locale::TranslatedString( labels, "step" );
}
}
}

View File

@ -98,6 +98,7 @@ public:
QString packageChoice() const { return m_packageChoice.value_or( QString() ); }
void setPackageChoice( const QString& packageChoice );
QString prettyName() const;
QString prettyStatus() const;
signals:
@ -120,6 +121,7 @@ private:
* Reading the property will return an empty QString.
*/
std::optional< QString > m_packageChoice;
CalamaresUtils::Locale::TranslatedString* m_stepName; // As it appears in the sidebar
};

View File

@ -29,7 +29,6 @@ PackageChooserViewStep::PackageChooserViewStep( QObject* parent )
: Calamares::ViewStep( parent )
, m_config( new Config( this ) )
, m_widget( nullptr )
, m_stepName( nullptr )
{
emit nextStatusChanged( false );
}
@ -41,14 +40,13 @@ PackageChooserViewStep::~PackageChooserViewStep()
{
m_widget->deleteLater();
}
delete m_stepName;
}
QString
PackageChooserViewStep::prettyName() const
{
return m_stepName ? m_stepName->get() : tr( "Packages" );
return m_config->prettyName();
}
@ -139,16 +137,6 @@ PackageChooserViewStep::setConfigurationMap( const QVariantMap& configurationMap
m_config->setDefaultId( moduleInstanceKey() );
m_config->setConfigurationMap( configurationMap );
bool labels_ok = false;
auto labels = CalamaresUtils::getSubMap( configurationMap, "labels", labels_ok );
if ( labels_ok )
{
if ( labels.contains( "step" ) )
{
m_stepName = new CalamaresUtils::Locale::TranslatedString( labels, "step" );
}
}
if ( m_widget )
{
hookupModel();

View File

@ -50,7 +50,6 @@ private:
Config* m_config;
PackageChooserPage* m_widget;
CalamaresUtils::Locale::TranslatedString* m_stepName; // As it appears in the sidebar
};
CALAMARES_PLUGIN_FACTORY_DECLARATION( PackageChooserViewStepFactory )

View File

@ -29,7 +29,7 @@ PackageChooserQmlViewStep::PackageChooserQmlViewStep( QObject* parent )
QString
PackageChooserQmlViewStep::prettyName() const
{
return tr( "Packages" );
return m_config->prettyName();
}
QString

View File

@ -42,6 +42,19 @@
#
method: legacy
# Human-visible strings in this module. These are all optional.
# The following translated keys are used:
# - *step*, used in the overall progress view (left-hand pane)
#
# Each key can have a [locale] added to it, which is used as
# the translated string for that locale. For the strings
# associated with the "no-selection" item, see *items*, below
# with the explicit item-*id* "".
#
labels:
step: "Packages"
step[nl]: "Pakketten"
# The *packageChoice* value is used for setting the default selection
# in the QML view; this should match one of the keys used in the QML
# module for package names.

View File

@ -58,10 +58,13 @@ FormatPartitionJob::prettyDescription() const
QString
FormatPartitionJob::prettyStatusMessage() const
{
QString partitionLabel = m_partition->label().isEmpty()
? m_partition->partitionPath()
: tr( "%1 (%2)", "partition label %1 (device path %2)" )
.arg( m_partition->label(), m_partition->partitionPath() );
return tr( "Formatting partition %1 with "
"file system %2." )
.arg( m_partition->partitionPath() )
.arg( userVisibleFS( m_partition->fileSystem() ) );
.arg( partitionLabel, userVisibleFS( m_partition->fileSystem() ) );
}

View File

@ -1,6 +1,6 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2020 - 2021 Anke Boersma <demm@kaosx.us>
* SPDX-FileCopyrightText: 2020 - 2022 Anke Boersma <demm@kaosx.us>
* SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
@ -123,6 +123,7 @@ Kirigami.ScrollablePage {
Kirigami.InlineMessage {
id: userMessage
Layout.fillWidth: true
showCloseButton: true
visible: false
type: Kirigami.MessageType.Error
text: qsTr("Only lowercase letters, numbers, underscore and hyphen are allowed.")
@ -131,6 +132,7 @@ Kirigami.ScrollablePage {
Kirigami.InlineMessage {
id: forbiddenMessage
Layout.fillWidth: true
showCloseButton: true
visible: false
type: Kirigami.MessageType.Error
text: qsTr("root is not allowed as username.")
@ -185,6 +187,7 @@ Kirigami.ScrollablePage {
Kirigami.InlineMessage {
id: hostMessage
Layout.fillWidth: true
showCloseButton: true
visible: false
type: Kirigami.MessageType.Error
text: qsTr("Only letters, numbers, underscore and hyphen are allowed, minimal of two characters.")
@ -193,6 +196,7 @@ Kirigami.ScrollablePage {
Kirigami.InlineMessage {
id: forbiddenHost
Layout.fillWidth: true
showCloseButton: true
visible: false
type: Kirigami.MessageType.Error
text: qsTr("localhost is not allowed as hostname.")