diff -Nru calamares-3.2.1/calamares.desktop calamares-3.2.2/calamares.desktop --- calamares-3.2.1/calamares.desktop 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/calamares.desktop 2018-09-04 12:03:59.000000000 +0000 @@ -57,9 +57,10 @@ Comment[fr]=Calamares - Installateur système Name[fr]=Installer le système Name[gl]=Instalación do Sistema -Icon[he]=קלמארס +Icon[he]=calamares GenericName[he]=אשף התקנה -Comment[he]=קלמארס - אשף התקנה +Comment[he]=Calamares - אשף התקנה +Name[he]=התקנת מערכת Icon[hi]=calamares GenericName[hi]=सिस्टम इंस्टॉलर Comment[hi]=Calamares — सिस्टम इंस्टॉलर @@ -144,6 +145,8 @@ Comment[sv]=Calamares — Systeminstallerare Name[sv]=Installera system Name[th]=ติดตั้งระบบ +GenericName[uk]=Встановлювач системи +Comment[uk]=Calamares - Встановлювач системи Name[uk]=Встановити Систему Icon[zh_CN]=calamares GenericName[zh_CN]=系统安装程序 diff -Nru calamares-3.2.1/CHANGES calamares-3.2.2/CHANGES --- calamares-3.2.1/CHANGES 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/CHANGES 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,125 @@ +This is the changelog for Calamares. For each release, the major changes and +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.2 (2018-09-04) = + +This release contains contributions from (alphabetically by first name): + - Andrius Štikonas + - artoo@cromnix.org + - Caio Carvalho + - Harald Sitter + - Philip Müller + - Simon Quigley + - Walter Lapchynski + +== Core == + + * Example configurations are **no longer installed** by default. + The default setting for *INSTALL_CONFIG* has changed. Distributions + are strongly encouraged to write their own configuration files and + not rely on the example configuration files. Example configurations + may change unpredictably. + * It is now possible to express module dependencies through the + *requiredModules* key in `module.desc`. All of the required modules + for a given module must occur in the sequence **before** the module + requiring them. None of the core modules use this facility. + * The search paths for QML files, branding descriptors and module + descriptors have been revamped and now self-document in the log. + * A new `ci/RELEASE.sh` script has been added to streamline releases; + it is not guaranteed to work anywhere in particular though. + +== Modules == + + * When multiple modules are mutually exclusive, or don't make sense + to enable concurrectly, a new `USE_` framework has been added + to CMake to simplify the selection of modules. This is in addition + to the existing `SKIP_MODULES` mechanism. + * Various off-by-one-sector errors in the automatic partitioning + mode have been corrected. In addition, swap space is calculated + a little more conservatively. + * A new module has been added to the core which can configure openrc + services. To make services configuration consistent: + - The *services* module has been **renamed** *services-systemd*, + - The openrc module is named *services-openrc*, + - At CMake time, it is possible to select all of the services modules, + or one specific one, by setting the *USE_services* CMake variable. + By default, all of the modules are built and installed. + * The systemd-services module can now disable targets and mask both + targets and services (which will allow you to break the system with + a bad configuration). The configuration is a little more flexible + because a service (or target) name can be used on its own with + sensible defaults. + * The displaymanager module has been entirely revamped. A long-standing + bug which ignored the settings for default desktop has been fixed + (thanks to Walter Lapchynski). Translations have been added to the + error messages. Each DM now has an implementation class for doing + all the configuration steps it needs. This groups the code needed for + a specific DM (and presumably, per-distro) in one place. + Distro's are **strongly advised** to re-test their DM configuration + and installation with the revamped code. + +**3.2.1** (2018-06-25) + +This release contains contributions from (alphabetically by first name): + - Bill Auguer + - Gabriel Craciunescu + - Phil Mueller + - Raul Rodrigo Segura + + == Core == + + * Qt 5.7 is now the minimum required Qt version. Because KPMCore + (a fairly fundamental dependency) requires Qt 5.7, Calamares + has followed suit. + * New testing application `loadmodule` for loading and running a + single Calamares module. + * New translations Belarussian and Korean. + * Jobs can now be *emergency jobs* which run even after a failure. + * Improved debugging when modules fail to load. + * Bad configuration files will now cause the user-interface of + Calamares to display an error message, rather than silently + ignoring some configuration errors. This will certainly cause + problems for distributions with sloppy configurations. + +== Modules == + + * New module preservefiles, keeps (log) files around after install; + this duplicates functionality with the unmount module, but unmount + is very late, rather limited, and fragile. + * Interactiveterminal module now disables itself if build requirements + are not met, rather than blocking the build. + * Fixes in the timezone map data make the southern hemisphere more + usable and put Reykjavik in its place. + * The packages module can now update the target system if explicitly + told to do so. + * More paths and executables are configurable in the bootloader module. + * Distributions are advised to review the `users.conf` setup **again**, + as some changes in version 3.2.0 caused regressions downstream. + * Distributions are advised to review their `locale.gen` files + **again**. Previous changes were too restrictive, matching only + the specific format Chakra Linux uses. Calamares now preserves + all the comment-lines in the file and writes enabled locales + at the end, with a descriptive comment. + +**3.2.0** (2018-05-17) + +This release contains contributions from (alphabetically by first name): + - Alf Gaida + - AlmAck + - Caio Carvalho + - Frede H + +== Modules == + + * UI annoyances in the partitioning module were fixed; the + mount-point selector is now more obvious when no mount-point + has been chosen, and the mount-point and flags are preserved + when (re)editing partitions. + * The handling of `@@ROOT@@` substitution in shellprocesses was + backwards; this has been fixed (the substitution is made when + running in the **host**). + * The user shell is no longer hard-coded to `/bin/bash`, + but follows the default setting for useradd(8), e.g. + those set in `/etc/default/useradd`. diff -Nru calamares-3.2.1/ci/RELEASE.sh calamares-3.2.2/ci/RELEASE.sh --- calamares-3.2.1/ci/RELEASE.sh 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/ci/RELEASE.sh 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,93 @@ +#! /bin/sh +# +# Release script for Calamares +# +# This attempts to perform the different steps of the RELEASE.md +# document automatically. It's not tested on other machines or +# setups other than [ade]'s development VM. +# +# Assumes that the version in CMakeLists.txt has been bumped, +# and that a release of that version is desired. +# +# None of the "update stuff" is done by this script; in preparation +# for the release, you should have already done: +# - updating the version +# - pulling translations +# - updating the language list +# - switching to the right branch + +test -d .git || { echo "Not at top-level." ; exit 1 ; } +test -d src/modules || { echo "No src/modules." ; exit 1 ; } + +which cmake > /dev/null 2>&1 || { echo "No cmake(1) available." ; exit 1 ; } + +### Build with default compiler +# +# +BUILDDIR=$(mktemp -d --suffix=-build --tmpdir=.) +rm -rf "$BUILDDIR" +mkdir "$BUILDDIR" || { echo "Could not create build directory." ; exit 1 ; } +( cd "$BUILDDIR" && cmake .. && make -j4 ) || { echo "Could not perform test-build." ; exit 1 ; } +( cd "$BUILDDIR" && make test ) || { echo "Tests failed." ; exit 1 ; } + +### Build with clang +# +# +if which clang++ > /dev/null 2>&1 ; then + # Do build again with clang + rm -rf "$BUILDDIR" + mkdir "$BUILDDIR" || { echo "Could not create build directory." ; exit 1 ; } + ( cd "$BUILDDIR" && CC=clang CXX=clang++ cmake .. && make -j4 ) || { echo "Could not perform test-build." ; exit 1 ; } + ( cd "$BUILDDIR" && make test ) || { echo "Tests failed." ; exit 1 ; } +fi + +### Get version number for this release +# +# +V=$( cd "$BUILDDIR" && make show-version | grep ^CALAMARES_VERSION | sed s/^[A-Z_]*=// ) +test -n "$V" || { echo "Could not obtain version." ; exit 1 ; } + +### Create signed tag +# +# This is the signing key ID associated with the GitHub account adriaandegroot, +# which is used to create all "verified" tags in the Calamares repo. +KEY_ID="128F00873E05AF1D" +git tag -u "$KEY_ID" -m "Release v$V" "v$V" || { echo "Could not sign tag v$V." ; exit 1 ; } + +### Create the tarball +# +# +TAR_V="calamares-$V" +TAR_FILE="$TAR_V.tar.gz" +git archive -o "$TAR_FILE" --prefix "$TAR_V/" "v$V" || { echo "Could not create tarball." ; exit 1 ; } +test -f "$TAR_FILE" || { echo "Tarball was not created." ; exit 1 ; } +SHA256=$(sha256sum "$TAR_FILE" | cut -d" " -f1) + +### Build the tarball +# +# +D=$(date +%Y%m%d-%H%M%S) +TMPDIR=$(mktemp -d --suffix="-calamares-$D") +test -d "$TMPDIR" || { echo "Could not create tarball-build directory." ; exit 1 ; } +tar xzf "$TAR_FILE" -C "$TMPDIR" || { echo "Could not unpack tarball." ; exit 1 ; } +test -d "$TMPDIR/$TAR_V" || { echo "Tarball did not contain source directory." ; exit 1 ; } +( cd "$TMPDIR/$TAR_V" && cmake . && make -j4 && make test ) || { echo "Tarball build failed." ; exit 1 ; } + +### Cleanup +# +rm -rf "$BUILDDIR" # From test-builds +rm -rf "$TMPDIR" # From tarball + +### Print subsequent instructions +# +# +cat <-. +# For example, services-systemd and services-openrc. +# +# Setting up SKIP_MODULES to ignore "the ones you don't want" can be +# annoying and error-prone (e.g. if a new module shows up). The USE_* +# modules provide a way to do automatic selection. To pick exactly +# one of the implementations from group , set USE_ to the +# name of the implementation. If USE_ is unset, or empty, then +# all the implementations are enabled (this just means they are +# **available** to `settings.conf`, not that they are used). +# +# Currently, no USE_ variables exist. +set( USE_services "" CACHE STRING "Select the services module to use" ) ### Calamares application info # @@ -54,10 +74,9 @@ set( CALAMARES_VERSION_MAJOR 3 ) set( CALAMARES_VERSION_MINOR 2 ) -set( CALAMARES_VERSION_PATCH 1 ) +set( CALAMARES_VERSION_PATCH 2 ) set( CALAMARES_VERSION_RC 0 ) - ### Transifex (languages) info # # complete = 100% translated, @@ -377,6 +396,15 @@ endif() endif() +# Special target for not-RC (e.g. might-be-release) builds. +# This is used by the release script to get the version. +if ( CALAMARES_VERSION_RC EQUAL 0 ) + add_custom_target(show-version + ${CMAKE_COMMAND} -E echo CALAMARES_VERSION=${CALAMARES_VERSION_SHORT} + USES_TERMINAL + ) +endif() + # enforce using constBegin, constEnd for const-iterators add_definitions( "-DQT_STRICT_ITERATORS" ) diff -Nru calamares-3.2.1/CMakeModules/CalamaresAddModuleSubdirectory.cmake calamares-3.2.2/CMakeModules/CalamaresAddModuleSubdirectory.cmake --- calamares-3.2.1/CMakeModules/CalamaresAddModuleSubdirectory.cmake 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/CMakeModules/CalamaresAddModuleSubdirectory.cmake 2018-09-04 12:03:59.000000000 +0000 @@ -85,9 +85,11 @@ configure_file( ${SUBDIRECTORY}/${MODULE_FILE} ${SUBDIRECTORY}/${MODULE_FILE} COPYONLY ) get_filename_component( FLEXT ${MODULE_FILE} EXT ) - if( "${FLEXT}" STREQUAL ".conf" AND INSTALL_CONFIG) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} - DESTINATION ${MODULE_DATA_DESTINATION} ) + if( "${FLEXT}" STREQUAL ".conf" ) + if( INSTALL_CONFIG ) + install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} + DESTINATION ${MODULE_DATA_DESTINATION} ) + endif() list( APPEND MODULE_CONFIG_FILES ${MODULE_FILE} ) else() install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIRECTORY}/${MODULE_FILE} @@ -102,10 +104,11 @@ message( " ${Green}MODULE_DESTINATION:${ColorReset} ${MODULE_DESTINATION}" ) if( MODULE_CONFIG_FILES ) if ( INSTALL_CONFIG ) - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${MODULE_DATA_DESTINATION}" ) + set( _destination "${MODULE_DATA_DESTINATION}" ) else() - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => [Skipping installation]" ) + set( _destination "[Build directory only]" ) endif() + message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${MODULE_CONFIG_FILES} => ${_destination}" ) endif() message( "" ) endif() diff -Nru calamares-3.2.1/CMakeModules/CalamaresAddPlugin.cmake calamares-3.2.2/CMakeModules/CalamaresAddPlugin.cmake --- calamares-3.2.1/CMakeModules/CalamaresAddPlugin.cmake 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/CMakeModules/CalamaresAddPlugin.cmake 2018-09-04 12:03:59.000000000 +0000 @@ -66,17 +66,18 @@ message( " ${Green}TYPE:${ColorReset} ${PLUGIN_TYPE}" ) message( " ${Green}LINK_LIBRARIES:${ColorReset} ${PLUGIN_LINK_LIBRARIES}" ) message( " ${Green}LINK_PRIVATE_LIBRARIES:${ColorReset} ${PLUGIN_LINK_PRIVATE_LIBRARIES}" ) -# message( " ${Green}SOURCES:${ColorReset} ${PLUGIN_SOURCES}" ) -# message( " ${Green}UI:${ColorReset} ${PLUGIN_UI}" ) -# message( " ${Green}EXPORT_MACRO:${ColorReset} ${PLUGIN_EXPORT_MACRO}" ) -# message( " ${Green}NO_INSTALL:${ColorReset} ${PLUGIN_NO_INSTALL}" ) message( " ${Green}PLUGIN_DESTINATION:${ColorReset} ${PLUGIN_DESTINATION}" ) if( PLUGIN_CONFIG_FILES ) + set( _destination "(unknown)" ) if ( INSTALL_CONFIG AND NOT PLUGIN_NO_INSTALL ) - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => ${PLUGIN_DATA_DESTINATION}" ) + set( _destination "${PLUGIN_DATA_DESTINATION}" ) + elseif( NOT PLUGIN_NO_INSTALL ) + # Not INSTALL_CONFIG + set( _destination "[Build directory only]" ) else() - message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => [Skipping installation]" ) + set( _destination "[Skipping installation]" ) endif() + message( " ${Green}CONFIGURATION_FILES:${ColorReset} ${PLUGIN_CONFIG_FILES} => ${_destination}" ) endif() if( PLUGIN_RESOURCES ) message( " ${Green}RESOURCES:${ColorReset} ${PLUGIN_RESOURCES}" ) @@ -147,12 +148,13 @@ install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_DESC_FILE} DESTINATION ${PLUGIN_DESTINATION} ) - if ( INSTALL_CONFIG ) - foreach( PLUGIN_CONFIG_FILE ${PLUGIN_CONFIG_FILES} ) - configure_file( ${PLUGIN_CONFIG_FILE} ${PLUGIN_CONFIG_FILE} COPYONLY ) - install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_CONFIG_FILE} - DESTINATION ${PLUGIN_DATA_DESTINATION} ) - endforeach() - endif() + foreach( PLUGIN_CONFIG_FILE ${PLUGIN_CONFIG_FILES} ) + configure_file( ${PLUGIN_CONFIG_FILE} ${PLUGIN_CONFIG_FILE} COPYONLY ) + if ( INSTALL_CONFIG ) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${PLUGIN_CONFIG_FILE} + DESTINATION ${PLUGIN_DATA_DESTINATION} ) + endif() + endforeach() endif() endfunction() diff -Nru calamares-3.2.1/CMakeModules/FindPythonQt.cmake calamares-3.2.2/CMakeModules/FindPythonQt.cmake --- calamares-3.2.1/CMakeModules/FindPythonQt.cmake 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/CMakeModules/FindPythonQt.cmake 2018-09-04 12:03:59.000000000 +0000 @@ -2,6 +2,9 @@ # # Sets PYTHONQT_FOUND, PYTHONQT_INCLUDE_DIR, PYTHONQT_LIBRARY, PYTHONQT_LIBRARIES # +# Also sets PYTHONQT_INCLUDE_DIRS to add whatever directories +# that are needed for extensions. +# # Python is required find_package(PythonLibs) @@ -24,22 +27,38 @@ ) if(NOT EXISTS "${PYTHONQT_INSTALL_DIR}") - find_path(PYTHONQT_INSTALL_DIR include/PythonQt/PythonQt.h DOC "Directory where PythonQt was installed.") + find_path(PYTHONQT_INSTALL_DIR + NAMES + include/PythonQt/PythonQt.h + include/PythonQt5/PythonQt.h + DOC "Directory where PythonQt was installed.") endif() + # XXX Since PythonQt 3.0 is not yet cmakeified, depending # on how PythonQt is built, headers will not always be # installed in "include/PythonQt". That is why "src" # is added as an option. See [1] for more details. # [1] https://github.com/commontk/CTK/pull/538#issuecomment-86106367 find_path(PYTHONQT_INCLUDE_DIR PythonQt.h - PATHS "${PYTHONQT_INSTALL_DIR}/include/PythonQt" + PATHS + "${PYTHONQT_INSTALL_DIR}/include/PythonQt" + "${PYTHONQT_INSTALL_DIR}/include/PythonQt5" "${PYTHONQT_INSTALL_DIR}/src" - DOC "Path to the PythonQt include directory") + DOC "Path to the PythonQt include directory") +find_path(PYTHONQT_ALL_INCLUDE_DIR PythonQt_QtAll.h + PATHS + "${PYTHONQT_INCLUDE_DIR}" + "${PYTHONQT_INSTALL_DIR}" + PATH_SUFFIXES + "extensions/PythonQt_QtAll" + "src" + DOC "Path to the PythonQt 'all' header") if ( NOT PythonQt_FIND_QUIETLY ) message( STATUS "Searching for PythonQt (PythonLibs ${PYTHONLIBS_MAJMIN}) .." ) if ( PYTHONQT_INCLUDE_DIR ) message( STATUS " .. found include ${PYTHONQT_INCLUDE_DIR}" ) + message( STATUS " .. found all include ${PYTHONQT_ALL_INCLUDE_DIR}" ) endif() endif() @@ -139,6 +158,10 @@ set(PYTHONQT_FOUND 1) set(PythonQt_FOUND ${PYTHONQT_FOUND}) set(PYTHONQT_LIBRARIES ${PYTHONQT_LIBRARY} ${PYTHONQT_LIBUTIL} ${PYTHONQT_QTALL_LIBRARY}) + set(PYTHONQT_INCLUDE_DIRS ${PYTHONQT_INCLUDE_DIR}) + if(PYTHONQT_ALL_INCLUDE_DIR) + list(APPEND PYTHONQT_INCLUDE_DIRS ${PYTHONQT_ALL_INCLUDE_DIR}) + endif() elseif(NOT PythonQt_FIND_QUIETLY) set(_missing "") if (NOT PYTHONQT_INCLUDE_DIR) diff -Nru calamares-3.2.1/debian/changelog calamares-3.2.2/debian/changelog --- calamares-3.2.1/debian/changelog 2018-08-21 05:16:19.000000000 +0000 +++ calamares-3.2.2/debian/changelog 2018-09-04 22:03:15.000000000 +0000 @@ -1,3 +1,14 @@ +calamares (3.2.2-0ubuntu1) cosmic; urgency=medium + + * New upstream release. + * Remove the reverse-applicable fix-defaultde-variable.patch. + * Bump Standards-version to 4.2.1, no changes needed. + * 0002-Add-patch-to-compile-with-pythonQt.patch is no longer needed in + favor of a better upstream solution. + * Remove reverse-applicable 0003-remove-wrong-path.patch. + + -- Simon Quigley Tue, 04 Sep 2018 17:03:15 -0500 + calamares (3.2.1-1ubuntu3) cosmic; urgency=medium [ Simon Quigley ] diff -Nru calamares-3.2.1/debian/control calamares-3.2.2/debian/control --- calamares-3.2.1/debian/control 2018-08-21 04:08:31.000000000 +0000 +++ calamares-3.2.2/debian/control 2018-09-04 21:41:38.000000000 +0000 @@ -40,7 +40,7 @@ qtdeclarative5-dev, qttools5-dev, qttools5-dev-tools -Standards-Version: 4.2.0 +Standards-Version: 4.2.1 Homepage: https://github.com/calamares/calamares Vcs-Browser: https://phab.lubuntu.me/source/calamares/ Vcs-Git: https://phab.lubuntu.me/source/calamares.git diff -Nru calamares-3.2.1/debian/patches/0002-Add-patch-to-compile-with-pythonQt.patch calamares-3.2.2/debian/patches/0002-Add-patch-to-compile-with-pythonQt.patch --- calamares-3.2.1/debian/patches/0002-Add-patch-to-compile-with-pythonQt.patch 2018-08-21 04:02:15.000000000 +0000 +++ calamares-3.2.2/debian/patches/0002-Add-patch-to-compile-with-pythonQt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -From: Raul Rodrigo Segura -Date: Thu, 14 Jun 2018 23:21:30 +0200 -Subject: Add patch to compile with pythonQt - ---- - CMakeModules/FindPythonQt.cmake | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/CMakeModules/FindPythonQt.cmake b/CMakeModules/FindPythonQt.cmake -index f0f4b8a..23e61d3 100644 ---- a/CMakeModules/FindPythonQt.cmake -+++ b/CMakeModules/FindPythonQt.cmake -@@ -24,7 +24,7 @@ string(REGEX REPLACE - ) - - if(NOT EXISTS "${PYTHONQT_INSTALL_DIR}") -- find_path(PYTHONQT_INSTALL_DIR include/PythonQt/PythonQt.h DOC "Directory where PythonQt was installed.") -+ find_path(PYTHONQT_INSTALL_DIR include/PythonQt5/PythonQt.h DOC "Directory where PythonQt was installed.") - endif() - # XXX Since PythonQt 3.0 is not yet cmakeified, depending - # on how PythonQt is built, headers will not always be -@@ -32,7 +32,7 @@ endif() - # is added as an option. See [1] for more details. - # [1] https://github.com/commontk/CTK/pull/538#issuecomment-86106367 - find_path(PYTHONQT_INCLUDE_DIR PythonQt.h -- PATHS "${PYTHONQT_INSTALL_DIR}/include/PythonQt" -+ PATHS "${PYTHONQT_INSTALL_DIR}/include/PythonQt5" - "${PYTHONQT_INSTALL_DIR}/src" - DOC "Path to the PythonQt include directory") - diff -Nru calamares-3.2.1/debian/patches/0003-remove-wrong-path.patch calamares-3.2.2/debian/patches/0003-remove-wrong-path.patch --- calamares-3.2.1/debian/patches/0003-remove-wrong-path.patch 2018-08-21 04:02:15.000000000 +0000 +++ calamares-3.2.2/debian/patches/0003-remove-wrong-path.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -From: Raul Rodrigo Segura -Date: Mon, 18 Jun 2018 13:28:56 +0200 -Subject: remove wrong path - ---- - src/libcalamaresui/modulesystem/PythonQtViewModule.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp -index 88b0c20..858097e 100644 ---- a/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp -+++ b/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp -@@ -29,7 +29,7 @@ - #include "JobQueue.h" - - #include --#include -+#include - - #include - #include diff -Nru calamares-3.2.1/debian/patches/fix-defaultde-variable.patch calamares-3.2.2/debian/patches/fix-defaultde-variable.patch --- calamares-3.2.1/debian/patches/fix-defaultde-variable.patch 2018-08-21 05:16:19.000000000 +0000 +++ calamares-3.2.2/debian/patches/fix-defaultde-variable.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -Description: Fix default desktop environment variable in displaymanager. -Author: Walter Lapchynski ---- a/src/modules/displaymanager/main.py -+++ b/src/modules/displaymanager/main.py -@@ -398,7 +398,7 @@ def run(): - username = libcalamares.globalstorage.value("autologinUser") - root_mount_point = libcalamares.globalstorage.value("rootMountPoint") - -- if "default_desktop_environment" in libcalamares.job.configuration: -+ if "defaultDesktopEnvironment" in libcalamares.job.configuration: - entry = libcalamares.job.configuration["defaultDesktopEnvironment"] - default_desktop_environment = DesktopEnvironment( - entry["executable"], entry["desktopFile"] diff -Nru calamares-3.2.1/debian/patches/series calamares-3.2.2/debian/patches/series --- calamares-3.2.1/debian/patches/series 2018-08-21 05:15:06.000000000 +0000 +++ calamares-3.2.2/debian/patches/series 2018-09-04 21:52:20.000000000 +0000 @@ -1,5 +1,2 @@ -fix-defaultde-variable.patch 0001-replace-pkexec-by-sudo.patch -0002-Add-patch-to-compile-with-pythonQt.patch -0003-remove-wrong-path.patch apport-package-hook.patch diff -Nru calamares-3.2.1/lang/calamares_ca.ts calamares-3.2.2/lang/calamares_ca.ts --- calamares-3.2.1/lang/calamares_ca.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_ca.ts 2018-09-04 12:03:59.000000000 +0000 @@ -579,7 +579,7 @@ En&crypt - &Xifra + En&cripta @@ -788,7 +788,7 @@ Skip writing LUKS configuration for Dracut: "/" partition is not encrypted - Omet l'escriptura de la configuració de LUKS per a Dracut: la partició "/" no està xifrada + Omet l'escriptura de la configuració de LUKS per a Dracut: la partició "/" no està encriptada @@ -872,7 +872,7 @@ En&crypt system - &Xifra el sistema + En&cripta el sistema @@ -948,7 +948,7 @@ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. - <h1>Tot fet.</h1><br/>%1 s'ha instal·lat al vostre ordinador.<br/>Ara podeu reiniciar-lo per tal d'accedir al sistema operatiu nou o bé continuar utilitzant l'entorn autònom de %2. + <h1>Tot fet.</h1><br/>%1 s'ha instal·lat a l'ordinador.<br/>Ara podeu reiniciar-lo per tal d'accedir al sistema operatiu nou o bé continuar utilitzant l'entorn autònom de %2. @@ -1786,12 +1786,12 @@ Boot partition not encrypted - Partició d'arrencada sense xifrar + Partició d'arrencada sense encriptar A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. - S'ha establert una partició d'arrencada separada conjuntament amb una partició d'arrel encriptada, però la partició d'arrencada no està encriptada.<br/><br/>Hi ha aspectes de seguretat amb aquest tipus de configuració, perquè hi ha fitxers del sistema importants en una partició no encriptada.<br/>Podeu continuar, si així ho desitgeu, però el desbloqueig del sistema de fitxers succeirà després, durant l'inici del sistema.<br/>Per encriptar la partició d'arrencada, torneu enrere i torneu-la a crear seleccionant <strong>Encripta</strong> a la finestra de creació de la partició. + S'ha establert una partició d'arrencada separada conjuntament amb una partició d'arrel encriptada, però la partició d'arrencada no està encriptada.<br/><br/>Hi ha assumptes de seguretat amb aquest tipus de configuració, perquè hi ha fitxers del sistema importants en una partició no encriptada.<br/>Podeu continuar, si així ho desitgeu, però el desbloqueig del sistema de fitxers succeirà després, durant l'inici del sistema.<br/>Per encriptar la partició d'arrencada, torneu enrere i torneu-la a crear seleccionant <strong>Encripta</strong> a la finestra de creació de la partició. @@ -1839,7 +1839,7 @@ Saving files for later ... - Desament dels fitxers per a més tard... + Desament de fitxers per a més tard... @@ -2292,12 +2292,12 @@ rootMountPoint is %1 - El punt de muntatge d'arrel és %1 + El punt de muntatge de l'arrel és %1 Cannot disable root account. - No es pot inhabilitar el compte de root. + No es pot inhabilitar el compte d'arrel. @@ -2528,7 +2528,7 @@ Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. - El nom d'amfitrió conté caràcters no vàlids. Només s'admeten lletres, números i guions. + El nom d'amfitrió conté caràcters no vàlids. Només s'hi admeten lletres, números i guions. @@ -2585,7 +2585,7 @@ <h1>Welcome to the Calamares installer for %1.</h1> - <h1>Benvingut a l'instal·lador Calamares per a %1.</h1> + <h1>Us donem la benvinguda a l'instal·lador Calamares per a %1.</h1> diff -Nru calamares-3.2.1/lang/calamares_el.ts calamares-3.2.2/lang/calamares_el.ts --- calamares-3.2.1/lang/calamares_el.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_el.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Κενή Σελίδα @@ -192,7 +192,7 @@ Calamares Initialization Failed - + Η αρχικοποίηση του Calamares απέτυχε @@ -207,7 +207,7 @@ &Install - + &Εγκατάσταση @@ -249,17 +249,17 @@ &Install now - Ε&γκατάσταση τώρα + &Εγκατάσταση τώρα Go &back - Μετάβαση πί&σω + Μετάβαση &πίσω &Done - + &Ολοκληρώθηκε @@ -2087,7 +2087,7 @@ The screen is too small to display the installer. - + Η οθόνη είναι πολύ μικρή για να απεικονίσει το πρόγραμμα εγκατάστασης @@ -2173,17 +2173,17 @@ Failed to write to %1 - + Αδυναμία εγγραφής στο %1 Failed to write keyboard configuration for X11. - + Αδυναμία εγγραφής στοιχείων διαμόρφωσης πληκτρολογίου για Χ11 Failed to write keyboard configuration to existing /etc/default directory. - + Αδυναμία εγγραφής στοιχείων διαμόρφωσης πληκτρολογίου στον υπάρχων κατάλογο /etc/default diff -Nru calamares-3.2.1/lang/calamares_es_MX.ts calamares-3.2.2/lang/calamares_es_MX.ts --- calamares-3.2.1/lang/calamares_es_MX.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_es_MX.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Página en blanco @@ -192,17 +192,17 @@ Calamares Initialization Failed - + La inicialización de Calamares ha fallado %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. - + %1 no pudo ser instalado. Calamares no pudo cargar todos los módulos configurados. Este es un problema con la forma en que Calamares esta siendo usada por la distribución. <br/>The following modules could not be loaded: - + <br/>Los siguientes módulos no pudieron ser cargados: @@ -1664,7 +1664,7 @@ Cre&ate - + Cre&ar diff -Nru calamares-3.2.1/lang/calamares_es.ts calamares-3.2.2/lang/calamares_es.ts --- calamares-3.2.1/lang/calamares_es.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_es.ts 2018-09-04 12:03:59.000000000 +0000 @@ -51,7 +51,7 @@ Blank Page - + Página Blanca @@ -193,22 +193,22 @@ Calamares Initialization Failed - + La inicialización de Calamares falló %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. - + %1 no se pudo instalar. Calamares no fue capaz de cargar todos los módulos configurados. Esto es un problema con la forma en que Calamares es usado por la distribución <br/>The following modules could not be loaded: - + Los siguientes módulos no se pudieron cargar: &Install - + &Instalar @@ -509,12 +509,12 @@ The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + El comando corre en el ambiente anfitrión y necesita saber el directorio raiz, pero no está definido el punto de montaje de la raiz The command needs to know the user's name, but no username is defined. - + El comando necesita saber el nombre de usuario, pero no hay nombre de usuario definido. @@ -1664,7 +1664,7 @@ Cre&ate - + Cre&ar @@ -1689,12 +1689,12 @@ Can not create new partition - + No se puede crear una partición nueva The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. - + La tabla de particiones en %1 tiene %2 particiones primarias y no se pueden agregar más. Por favor remueva una partición primaria y agregue una partición extendida en su reemplazo. @@ -1824,7 +1824,7 @@ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. - + Elija una apariencia para KDE Plasma Desktop. También puede omitir este paso y configurar el aspecto una vez que el sistema está instalado. Al hacer clic en una selección de apariencia, obtendrá una vista previa en vivo de esa apariencia. @@ -1840,17 +1840,17 @@ Saving files for later ... - + Guardando archivos para después ... No files configured to save for later. - + No hay archivos configurados para guardarlos para después. Not all of the configured files could be preserved. - + No todos los archivos de configuración se pudieron preservar. @@ -2368,7 +2368,7 @@ %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 diff -Nru calamares-3.2.1/lang/calamares_he.ts calamares-3.2.2/lang/calamares_he.ts --- calamares-3.2.1/lang/calamares_he.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_he.ts 2018-09-04 12:03:59.000000000 +0000 @@ -4,17 +4,17 @@ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. - <strong>תצורת האתחול</strong> של מערכת זו. <br><br> מערכות x86 ישנות יותר תומכות אך ורק ב <strong>BIOS</strong>.<br> מערכות חדשות משתמשות בדרך כלל ב <strong>EFI</strong>, אך יכולות להיות מוצגות כ BIOS במידה והן מופעלות במצב תאימות לאחור. + <strong>תצורת האתחול</strong> של מערכת זו. <br><br> מערכות x86 ישנות יותר תומכות אך ורק ב־<strong>BIOS</strong>.<br> מערכות חדשות משתמשות בדרך כלל ב־<strong>EFI</strong>, אך עשוית להופיע כ־BIOS אם הן מופעלות במצב תאימות לאחור. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. - מערכת זו הופעלה בתצורת אתחול <strong>EFI</strong>.<br><br> בכדי להגדיר הפעלה מתצורת אתחול EFI, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong> או <strong>systemd-boot</strong> על <strong>מחיצת מערכת EFI</strong>. פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך לבחור זאת או להגדיר בעצמך. + מערכת זו הופעלה בתצורת אתחול <strong>EFI</strong>.<br><br> כדי להגדיר הפעלה מתצורת אתחול EFI, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong> או <strong>systemd-boot</strong> על <strong>מחיצת מערכת EFI</strong>. פעולה זו היא אוטומטית, אלא אם כן העדפתך היא להגדיר מחיצות באופן ידני, במקרה זה עליך לבחור זאת או להגדיר בעצמך. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. - מערכת זו הופעלה בתצורת אתחול <strong>BIOS</strong>.<br><br> בכדי להגדיר הפעלה מתצורת אתחול BIOS, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong>, בתחלית מחיצה או על ה <strong>Master Boot Record</strong> בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך להגדיר זאת בעצמך. + מערכת זו הופעלה בתצורת אתחול <strong>BIOS</strong>.<br><br> כדי להגדיר הפעלה מתצורת אתחול BIOS, על אשף ההתקנה להתקין מנהל אתחול מערכת, לדוגמה <strong>GRUB</strong>, בתחילת המחיצה או על ה־<strong>Master Boot Record</strong> בצמוד להתחלה של טבלת המחיצות (מועדף). פעולה זו היא אוטומטית, אלא אם כן תבחר להגדיר מחיצות באופן ידני, במקרה זה עליך להגדיר זאת בעצמך. @@ -37,7 +37,7 @@ Do not install a boot loader - אל תתקין מנהל אתחול מערכת, boot loader + לא להתקין מנהל אתחול מערכת @@ -50,7 +50,7 @@ Blank Page - + עמוד ריק @@ -107,7 +107,7 @@ Install - התקן + התקנה @@ -115,7 +115,7 @@ Done - בוצע + הסתיים @@ -123,12 +123,12 @@ Run command %1 %2 - הרץ פקודה %1 %2 + הרצת הפקודה %1 %2 Running command %1 %2 - מריץ פקודה %1 %2 + הפקודה %1 %2 רצה @@ -136,17 +136,17 @@ Running %1 operation. - מריץ פעולה %1. + הפעולה %1 רצה. Bad working directory path - נתיב תיקיית עבודה לא תקין + נתיב תיקיית עבודה שגוי Working directory %1 for python job %2 is not readable. - תיקיית עבודה %1 עבור משימת python %2 לא קריאה. + תיקיית העבודה %1 עבור משימת python‏ %2 אינה קריאה. @@ -161,7 +161,7 @@ Boost.Python error in job "%1". - שגיאת Boost.Python במשימה "%1". + שגיאת Boost.Python במשימה „%1”. @@ -169,56 +169,56 @@ &Back - &קודם + ה&קודם &Next - &הבא + הב&א &Cancel - &בטל + &ביטול Cancel installation without changing the system. - בטל התקנה ללא ביצוע שינוי במערכת. + ביטול התקנה ללא ביצוע שינוי במערכת. Calamares Initialization Failed - + הפעלת Calamares נכשלה %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. - + אין אפשרות להתקין את %1. ל־Calamares אין אפשרות לטעון את המודולים המוגדרים. מדובר בתקלה באופן בו ההפצה משתמשת ב־Calamares. <br/>The following modules could not be loaded: - + <br/>לא ניתן לטעון את המודולים הבאים: &Install - + הת&קנה Cancel installation? - בטל את ההתקנה? + לבטל את ההתקנה? Do you really want to cancel the current install process? The installer will quit and all changes will be lost. - האם אתה בטוח שברצונך לבטל את תהליך ההתקנה? + לבטל את תהליך ההתקנה? אשף ההתקנה ייסגר וכל השינויים יאבדו. @@ -234,12 +234,12 @@ &Close - &סגור + &סגירה Continue with setup? - המשך עם הליך ההתקנה? + להמשיך בהתקנה? @@ -249,22 +249,22 @@ &Install now - &התקן כעת + להת&קין כעת Go &back - &אחורה + ח&זרה &Done - &בוצע + &סיום The installation is complete. Close the installer. - תהליך ההתקנה הושלם. אנא סגור את אשף ההתקנה. + תהליך ההתקנה הושלם. נא לסגור את אשף ההתקנה. @@ -310,7 +310,7 @@ Show debug information - הצג מידע על ניפוי שגיאות + הצגת מידע ניפוי שגיאות @@ -323,17 +323,17 @@ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - המחשב לא עומד בחלק מרף דרישות המינימום להתקנת %1.<br/> ההתקנה יכולה להמשיך, אך חלק מהתכונות יכולות להיות מבוטלות. + המחשב לא עומד בחלק מרף דרישות המינימום להתקנת %1.<br/> ההתקנה יכולה להמשיך, אך יתכן כי חלק מהתכונות יושבתו. This program will ask you some questions and set up %2 on your computer. - אשף התקנה זה נכתב בלשון זכר אך מיועד לשני המינים. תוכנה זו תשאל אותך מספר שאלות ותגדיר את %2 על המחשב שלך. + תכנית זו תשאל אותך מספר שאלות ותתקין את %2 על המחשב שלך. For best results, please ensure that this computer: - לקבלת התוצאות הטובות ביותר, אנא וודא כי מחשב זה: + לקבלת התוצאות הטובות ביותר, נא לוודא כי מחשב זה: @@ -356,7 +356,7 @@ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. - <strong>הגדרת מחיצות באופן ידני</strong><br/>תוכל ליצור או לשנות את גודל המחיצות בעצמך. + <strong>הגדרת מחיצות באופן ידני</strong><br/>ניתן ליצור או לשנות את גודל המחיצות בעצמך. @@ -366,12 +366,12 @@ %1 will be shrunk to %2MB and a new %3MB partition will be created for %4. - %1 תוקטן ל %2 MB ומחיצה חדשה בגודל %3 MB תיווצר עבור %4. + %1 תוקטן לכדי %2 מ״ב ותיווצר מחיצה חדשה בגודל %3 מ״ב עבור %4. Select storage de&vice: - בחר ה&תקן אחסון: + בחירת התקן א&חסון: @@ -384,27 +384,27 @@ Reuse %1 as home partition for %2. - השתמש ב %1 כמחיצת הבית, home, עבור %2. + להשתמש ב־%1 כמחיצת הבית (home) עבור %2. <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> - <strong>בחר מחיצה לכיווץ, לאחר מכן גרור את הסרגל התחתון בכדי לשנות את גודלה</strong> + <strong>ראשית יש לבחור מחיצה לכיווץ, לאחר מכן לגרור את הסרגל התחתון כדי לשנות את גודלה</strong> <strong>Select a partition to install on</strong> - <strong>בחר מחיצה בכדי לבצע את ההתקנה עליה</strong> + <strong>נא לבחור מחיצה כדי להתקין עליה</strong> An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. - מחיצת מערכת EFI לא נמצאה במערכת. אנא חזור והשתמש ביצירת מחיצות באופן ידני בכדי להגדיר את %1. + במערכת זו לא נמצאה מחיצת מערכת EFI. נא לחזור ולהשתמש ביצירת מחיצות באופן ידני כדי להגדיר את %1. The EFI system partition at %1 will be used for starting %2. - מחיצת מערכת EFI ב %1 תשמש עבור טעינת %2. + מחיצת מערכת ה־EFI שב־%1 תשמש עבור טעינת %2. @@ -414,7 +414,7 @@ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - לא נמצאה מערכת הפעלה על התקן אחסון זה. מה ברצונך לעשות?<br/> תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. + לא נמצאה מערכת הפעלה על התקן אחסון זה. מה ברצונך לעשות?<br/> ניתן לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. @@ -422,12 +422,12 @@ <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. - <strong>מחק כונן</strong><br/> פעולה זו <font color="red">תמחק</font> את כל המידע השמור על התקן האחסון הנבחר. + <strong>מחיקת כונן</strong><br/> פעולה זו <font color="red">תמחק</font> את כל המידע השמור על התקן האחסון הנבחר. This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - נמצא %1 על התקן אחסון זה. מה ברצונך לעשות?<br/> תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. + בהתקן אחסון זה נמצאה %1. מה ברצונך לעשות?<br/> ניתן לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. @@ -435,7 +435,7 @@ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. - <strong>התקן לצד</strong><br/> אשף ההתקנה יכווץ מחיצה בכדי לפנות מקום עבור %1. + <strong>התקנה לצד</strong><br/> אשף ההתקנה יכווץ מחיצה כדי לפנות מקום לטובת %1. @@ -443,17 +443,17 @@ <strong>Replace a partition</strong><br/>Replaces a partition with %1. - <strong>החלף מחיצה</strong><br/> מבצע החלפה של המחיצה עם %1. + <strong>החלפת מחיצה</strong><br/> ביצוע החלפה של המחיצה ב־%1. This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - מערכת הפעלה קיימת על התקן האחסון הזה. מה ברצונך לעשות?<br/> תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. + כבר קיימת מערכת הפעלה על התקן האחסון הזה. כיצד להמשיך?<br/> ניתן לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - מערכות הפעלה מרובות קיימות על התקן אחסון זה. מה ברצונך לעשות? <br/>תוכל לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. + ישנן מגוון מערכות הפעלה על התקן אחסון זה. איך להמשיך? <br/>ניתן לסקור ולאשר את בחירתך לפני ששינויים יתבצעו על התקן האחסון. @@ -461,17 +461,17 @@ Clear mounts for partitioning operations on %1 - מחק נקודות עיגון עבור ביצוע פעולות של הגדרות מחיצה על %1. + מחיקת נקודות עיגון עבור פעולות חלוקה למחיצות על %1. Clearing mounts for partitioning operations on %1. - מבצע מחיקה של נקודות עיגון עבור ביצוע פעולות של הגדרות מחיצה על %1. + מתבצעת מחיקה של נקודות עיגון לטובת פעולות חלוקה למחיצות על %1. Cleared all mounts for %1 - בוצעה מחיקה עבור כל נקודות העיגון על %1. + כל נקודות העיגון על %1 נמחקו. @@ -479,7 +479,7 @@ Clear all temporary mounts. - מחק את כל נקודות העיגון הזמניות. + מחיקת כל נקודות העיגון הזמניות. @@ -503,17 +503,17 @@ Could not run command. - + לא ניתן להריץ את הפקודה. The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + הפקודה פועלת בסביבת המארח ועליה לדעת מה נתיב השורש, אך לא צוין rootMountPoint. The command needs to know the user's name, but no username is defined. - + הפקודה צריכה לדעת מה שם המשתמש, אך לא הוגדר שם משתמש. @@ -529,7 +529,7 @@ Create a Partition - צור מחיצה + יצירת מחיצה @@ -559,7 +559,7 @@ LVM LV name - + שם כרך לוגי במנהל הכרכים הלוגיים @@ -579,7 +579,7 @@ En&crypt - ה&צפן + ה&צפנה @@ -599,7 +599,7 @@ Mountpoint already in use. Please select another one. - נקודת העיגון בשימוש. אנא בחר נקודת עיגון אחרת. + נקודת העיגון בשימוש. נא לבחור בנקודת עיגון אחרת. @@ -607,7 +607,7 @@ Create new %2MB partition on %4 (%3) with file system %1. - צור מחיצה חדשה בגודל %2 MB על %4 (%3) עם מערכת קבצים %1. + יצירת מחיצה חדשה בגודל של %2 מ״ב על גבי %4 (%3) עם מערכת הקבצים %1. @@ -617,12 +617,12 @@ Creating new %1 partition on %2. - מגדיר מחיצה %1 חדשה על %2. + מוגדרת מחיצת %1 חדשה על %2. The installer failed to create partition on disk '%1'. - אשף ההתקנה נכשל ביצירת מחיצה על כונן '%1'. + אשף ההתקנה נכשל ביצירת מחיצה על הכונן ‚%1’. @@ -630,7 +630,7 @@ Create Partition Table - צור טבלת מחיצות + יצירת טבלת מחיצות @@ -658,17 +658,17 @@ Create new %1 partition table on %2. - צור טבלת מחיצות %1 חדשה על %2. + יצירת טבלת מחיצות חדשה מסוג %1 על %2. Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). - צור טבלת מחיצות <strong>%1</strong> חדשה על <strong>%2</strong> (%3). + יצירת טבלת מחיצות חדשה מסוג <strong>%1</strong> על <strong>%2</strong> (%3). Creating new %1 partition table on %2. - יוצר טבלת מחיצות %1 חדשה על %2. + נוצרת טבלת מחיצות חדשה מסוג %1 על %2. @@ -681,17 +681,17 @@ Create user %1 - צור משתמש %1 + יצירת משתמש %1 Create user <strong>%1</strong>. - צור משתמש <strong>%1</strong>. + יצירת משתמש <strong>%1</strong>. Creating user %1. - יוצר משתמש %1. + נוצר משתמש %1. @@ -719,7 +719,7 @@ Delete partition %1. - מחק את מחיצה %1. + מחיקת המחיצה %1. @@ -793,7 +793,7 @@ Failed to open %1 - נכשלה פתיחת %1. + הפתיחה של %1 נכשלה. @@ -801,7 +801,7 @@ Dummy C++ Job - משימת דמה של C++ + משימת דמה של C++‎ @@ -809,17 +809,17 @@ Edit Existing Partition - ערוך מחיצה קיימת + עריכת מחיצה קיימת Content: - תכולה: + תוכן: &Keep - &השאר + לה&שאיר @@ -859,7 +859,7 @@ Mountpoint already in use. Please select another one. - נקודת העיגון בשימוש. אנא בחר נקודת עיגון אחרת. + נקודת העיגון בשימוש. נא לבחור בנקודת עיגון אחרת. @@ -872,22 +872,22 @@ En&crypt system - ה&צפן את המערכת + ה&צפנת המערכת Passphrase - ביטוי אבטחה + מילת צופן Confirm passphrase - אשר ביטוי אבטחה + אישור מילת צופן Please enter the same passphrase in both boxes. - אנא הכנס ביטוי אבטחה זהה בשני התאים. + נא להקליד את אותה מילת הצופן בשתי התיבות. @@ -895,37 +895,37 @@ Set partition information - הגדר מידע עבור המחיצה + הגדרת מידע עבור המחיצה Install %1 on <strong>new</strong> %2 system partition. - התקן %1 על מחיצת מערכת %2 <strong>חדשה</strong>. + התקנת %1 על מחיצת מערכת <strong>חדשה</strong> מסוג %2. Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. - הגדר מחיצת מערכת %2 <strong>חדשה</strong>בעלת נקודת עיגון <strong>%1</strong>. + הגדרת מחיצת מערכת <strong>חדשה</strong> מסוג %2 עם נקודת העיגון <strong>%1</strong>. Install %2 on %3 system partition <strong>%1</strong>. - התקן %2 על מחיצת מערכת %3 <strong>%1</strong>. + התקנת %2 על מחיצת מערכת <strong>%1</strong> מסוג %3. Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. - התקן מחיצה %3 <strong>%1</strong> עם נקודת עיגון <strong>%2</strong>. + התקן מחיצה מסוג %3 <strong>%1</strong> עם נקודת העיגון <strong>%2</strong>. Install boot loader on <strong>%1</strong>. - התקן מנהל אתחול מערכת על <strong>%1</strong>. + התקנת מנהל אתחול מערכת על <strong>%1</strong>. Setting up mount points. - מגדיר נקודות עיגון. + נקודות עיגון מוגדרות. @@ -938,12 +938,12 @@ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style=" font-style:italic;">Done</span> or close the installer.</p></body></html> - + <html><head/><body><p>כאשר תיבה זו מסומנת, המערכת שלך תופעל מחדש מיידית עם הלחיצה על <span style=" font-style:italic;">סיום</span> או עם סגירת תכנית ההתקנה.</p></body></html> &Restart now - &אתחל כעת + ה&פעלה מחדש כעת @@ -979,12 +979,12 @@ Format partition %1 (file system: %2, size: %3 MB) on %4. - אתחל מחיצה %1 (מערכת קבצים: %2, גודל: %3 MB) על %4. + אתחול מחיצה %1 (מערכת קבצים: %2, גודל: %3 מ״ב) על %4. Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. - אתחול מחיצה <strong>%1</strong> בגודל <strong>%3 MB</strong> עם מערכת קבצים <strong>%2</strong>. + אתחול מחיצה <strong>%1</strong> בגודל <strong>%3 מ״ב</strong> עם מערכת קבצים <strong>%2</strong>. @@ -994,7 +994,7 @@ The installer failed to format partition %1 on disk '%2'. - אשף ההתקנה נכשל בעת אתחול המחיצה %1 על כונן '%2'. + אשף ההתקנה נכשל בעת אתחול המחיצה %1 על הכונן ‚%2’. @@ -1007,12 +1007,12 @@ Please install KDE Konsole and try again! - אנא התקן את KDE Konsole ונסה שוב! + נא להתקין את KDE Konsole ולנסות שוב! Executing script: &nbsp;<code>%1</code> - מריץ תסריט הרצה: &nbsp; <code>%1</code> + הסקריפט מופעל: &nbsp; <code>%1</code> @@ -1020,7 +1020,7 @@ Script - תסריט הרצה + סקריפט @@ -1028,12 +1028,12 @@ Set keyboard model to %1.<br/> - הגדר את דגם המקלדת ל %1.<br/> + הגדרת דגם המקלדת בתור %1.<br/> Set keyboard layout to %1/%2. - הגדר את פריסת לוח המקשים ל %1/%2. + הגדרת פריסת לוח המקשים בתור %1/%2. @@ -1077,17 +1077,17 @@ I accept the terms and conditions above. - אני מאשר את התנאים וההתניות מעלה. + התנאים וההגבלות שלמעלה מקובלים עלי. <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. - <h1>הסכם רישיון</h1>אשף התקנה זה יבצע התקנה של תוכנות קנייניות אשר כפופות לתנאי רישיון. + <h1>הסכם רישיון</h1>אשף התקנה זה יבצע התקנה של תכניות קנייניות אשר כפופות לתנאי רישיון. Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. - אנא סקור את הסכם משתמש הקצה (EULA) מעלה.<br/> במידה ואינך מסכים עם התנאים, תהליך ההתקנה יופסק. + נא לעיין בהסכם משתמש הקצה (EULA) מעלה.<br/> אם התנאים אינם מקובלים עליך, תהליך ההתקנה יופסק. @@ -1097,7 +1097,7 @@ Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. - אנא סקור את הסכם משתמש הקצה (EULA) מעלה.<br/> במידה ואינך מסכים עם התנאים, תוכנות קנייניות לא יותקנו, ותוכנות חליפיות מבוססות קוד פתוח יותקנו במקומן. + נא לעיין בהסכם משתמש הקצה (EULA) מעלה.<br/> אם התנאים אינם מקובלים עליך, לא תותקנה תכניות קנייניות, במקומן תותקנה תכניות חלופיות מבוססות קוד פתוח. @@ -1134,7 +1134,7 @@ <a href="%1">view license agreement</a> - <a href="%1">צפה בהסכם הרשיון</a> + <a href="%1">הצגת הסכם הרישיון</a> @@ -1142,7 +1142,7 @@ License - רשיון + רישיון @@ -1171,12 +1171,12 @@ &Change... - &החלף... + ה&חלפה… Set timezone to %1/%2.<br/> - הגדרת אזור זמן ל %1/%2.<br/> + הגדרת אזור זמן בתור %1/%2.<br/> @@ -1190,7 +1190,7 @@ Loading location data... - טוען נתונים על המיקום... + הנתונים על המיקום נטענים… @@ -1213,12 +1213,12 @@ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) - התקנת רשת. (מנוטרלת: לא ניתן לאחזר רשימות של חבילות תוכנה, אנא בדוק את חיבורי הרשת) + התקנה מהרשת. (מושבתת: לא ניתן לקבל רשימות של חבילות תכנה, נא לבדוק את החיבור לרשת) Network Installation. (Disabled: Received invalid groups data) - התקנה מהרשת. (מנוטרל: התקבל מידע שגוי בנושא הקבוצות) + התקנה מהרשת. (מושבתת: המידע שהתקבל על קבוצות שגוי) @@ -1234,242 +1234,242 @@ Password is too short - הסיסמה קצרה מדי + הססמה קצרה מדי Password is too long - הסיסמה ארוכה מדי + הססמה ארוכה מדי Password is too weak - + הססמה חלשה מדי Memory allocation error when setting '%1' - + שגיאת הקצאת זיכרון בעת הגדרת ‚%1’ Memory allocation error - + שגיאת הקצאת זיכרון The password is the same as the old one - + הססמה זהה לישנה The password is a palindrome - + הססמה היא פלינדרום The password differs with case changes only - + מורכבות הססמה טמונה בשינויי סוגי אותיות בלבד The password is too similar to the old one - + הססמה דומה מדי לישנה The password contains the user name in some form - + הססמה מכילה את שם המשתמש בצורה כלשהי The password contains words from the real name of the user in some form - + הססמה מכילה מילים מהשם האמתי של המשתמש בצורה זו או אחרת The password contains forbidden words in some form - + הססמה מכילה מילים אסורות בצורה כלשהי The password contains less than %1 digits - + הססמה מכילה פחות מ־%1 ספרות The password contains too few digits - + הססמה לא מכילה מספיק ספרות The password contains less than %1 uppercase letters - + הססמה מכילה פחות מ־%1 אותיות גדולות The password contains too few uppercase letters - + הססמה מכילה מעט מדי אותיות גדולות The password contains less than %1 lowercase letters - + הססמה מכילה פחות מ־%1 אותיות קטנות The password contains too few lowercase letters - + הססמה אינה מכילה מספיק אותיות קטנות The password contains less than %1 non-alphanumeric characters - + הססמה מכילה פחות מ־%1 תווים שאינם אלפאנומריים The password contains too few non-alphanumeric characters - + הססמה מכילה מעט מדי תווים שאינם אלפאנומריים The password is shorter than %1 characters - + אורך הססמה קצר מ־%1 תווים The password is too short - + הססמה קצרה מדי The password is just rotated old one - + הססמה היא פשוט סיכול של ססמה קודמת The password contains less than %1 character classes - + הססמה מכילה פחות מ־%1 סוגי תווים The password does not contain enough character classes - + הססמה לא מכילה מספיק סוגי תווים The password contains more than %1 same characters consecutively - + הססמה מכילה יותר מ־%1 תווים זהים ברצף The password contains too many same characters consecutively - + הססמה מכילה יותר מדי תווים זהים ברצף The password contains more than %1 characters of the same class consecutively - + הססמה מכילה יותר מ־%1 תווים מאותו הסוג ברצף The password contains too many characters of the same class consecutively - + הססמה מכילה יותר מדי תווים מאותו הסוג ברצף The password contains monotonic sequence longer than %1 characters - + הססמה מכילה רצף תווים מונוטוני של יותר מ־%1 תווים The password contains too long of a monotonic character sequence - + הססמה מכילה רצף תווים מונוטוני ארוך מדי No password supplied - + לא צוינה ססמה Cannot obtain random numbers from the RNG device - + לא ניתן לקבל מספרים אקראיים מהתקן ה־RNG Password generation failed - required entropy too low for settings - + יצירת הססמה נכשלה - רמת האקראיות הנדרשת נמוכה ביחס להגדרות The password fails the dictionary check - %1 - + הססמה נכשלה במבחן המילון - %1 The password fails the dictionary check - + הססמה נכשלה במבחן המילון Unknown setting - %1 - + הגדרה לא מוכרת - %1 Unknown setting - + הגדרה לא מוכרת Bad integer value of setting - %1 - + ערך מספרי שגוי להגדרה - %1 Bad integer value - + ערך מספרי שגוי Setting %1 is not of integer type - + ההגדרה %1 אינה מסוג מספר שלם Setting is not of integer type - + ההגדרה אינה מסוג מספר שלם Setting %1 is not of string type - + ההגדרה %1 אינה מסוג מחרוזת Setting is not of string type - + ההגדרה אינה מסוג מחרוזת Opening the configuration file failed - + פתיחת קובץ התצורה נכשלה The configuration file is malformed - + קובץ התצורה פגום Fatal failure - + כשל מכריע Unknown error - + שגיאה לא ידועה @@ -1487,7 +1487,7 @@ Type here to test your keyboard - הקלד כאן בכדי לבדוק את המקלדת שלך + ניתן להקליד כאן כדי לבדוק את המקלדת שלך @@ -1500,64 +1500,64 @@ What is your name? - מהו שמך? + מה שמך? What name do you want to use to log in? - באיזה שם ברצונך להשתמש בעת כניסה למחשב? + איזה שם ברצונך שישמש אותך לכניסה? font-weight: normal - משקל-גופן: נורמלי + font-weight: normal <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> - <small>במידה ויותר מאדם אחד ישתמש במחשב זה, תוכל להגדיר משתמשים נוספים לאחר ההתקנה.</small> + <small>אם יותר מאדם אחד אמור להשתמש במחשב זה, ניתן להגדיר משתמשים נוספים לאחר ההתקנה.</small> Choose a password to keep your account safe. - בחר סיסמה בכדי להגן על חשבונך. + נא לבחור ססמה להגנה על חשבונך. <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> - <small>הכנס את אותה הסיסמה פעמיים, בכדי שניתן יהיה לבדוק שגיאות הקלדה. סיסמה טובה אמורה להכיל שילוב של אותיות, מספרים וסימני פיסוק, להיות באורך שמונה תווים לפחות, ועליה להשתנות במרווחי זמן קבועים.</small> + <small>יש להקליד את אותה הססמה פעמיים כדי שניתן יהיה לבדוק שגיאות הקלדה. ססמה טובה אמורה להכיל שילוב של אותיות, מספרים וסימני פיסוק, להיות באורך של שמונה תווים לפחות ויש להחליף אותה במרווחי זמן קבועים.</small> What is the name of this computer? - מהו שם מחשב זה? + מהו השם של המחשב הזה? <small>This name will be used if you make the computer visible to others on a network.</small> - <small>שם זה יהיה בשימוש במידה ומחשב זה יוגדר להיות נראה על ידי עמדות אחרות ברשת.</small> + <small>בשם זה ייעשה שימוש לטובת זיהוי מול מחשבים אחרים ברשת במידת הצורך.</small> Log in automatically without asking for the password. - התחבר באופן אוטומטי מבלי לבקש סיסמה. + כניסה אוטומטית מבלי לבקש ססמה. Use the same password for the administrator account. - השתמש באותה הסיסמה עבור חשבון המנהל. + להשתמש באותה הססמה עבור חשבון המנהל. Choose a password for the administrator account. - בחר סיסמה עבור חשבון המנהל. + בחירת ססמה עבור חשבון המנהל. <small>Enter the same password twice, so that it can be checked for typing errors.</small> - <small>הכנס את אותה הסיסמה פעמיים, בכדי שניתן יהיה לבדוק שגיאות הקלדה.</small> + <small>עליך להקליד את אותה הססמה פעמיים כדי לאפשר זיהוי של שגיאות הקלדה.</small> @@ -1585,7 +1585,7 @@ Swap - דפדוף, Swap + דפדוף Swap @@ -1648,12 +1648,12 @@ Storage de&vice: - &התקן זכרון: + ה&תקן זיכרון: &Revert All Changes - &בטל את כל השינויים + &ביטול כל השינויים @@ -1663,37 +1663,37 @@ Cre&ate - + י&צירה &Edit - &ערוך + &עריכה &Delete - &מחק + מ&חיקה Install boot &loader on: - התקן &מנהל אתחול מערכת על: + התקנת מ&נהל אתחול מערכת על: Are you sure you want to create a new partition table on %1? - האם אתה בטוח שברצונך ליצור טבלת מחיצות חדשה על %1? + ליצור טבלת מחיצות חדשה על %1? Can not create new partition - + לא ניתן ליצור מחיצה חדשה The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. - + לטבלת המחיצות על %1 כבר יש %2 מחיצות עיקריות ואי אפשר להוסיף עוד כאלה. נא להסיר מחיצה עיקרית אחת ולהוסיף מחיצה מורחבת במקום. @@ -1701,7 +1701,7 @@ Gathering system information... - מלקט מידע אודות המערכת... + נאסף מידע על המערכת… @@ -1711,42 +1711,42 @@ Install %1 <strong>alongside</strong> another operating system. - התקן את %1 <strong>לצד</strong> מערכת הפעלה אחרת. + להתקין את %1 <strong>לצד</strong> מערכת הפעלה אחרת. <strong>Erase</strong> disk and install %1. - <strong>מחק</strong> את הכונן והתקן את %1. + <strong>למחוק</strong> את הכונן ולהתקין את %1. <strong>Replace</strong> a partition with %1. - <strong>החלף</strong> מחיצה עם %1. + <strong>החלפת</strong> מחיצה עם %1. <strong>Manual</strong> partitioning. - מגדיר מחיצות באופן <strong>ידני</strong>. + להגדיר מחיצות באופן <strong>ידני</strong>. Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). - התקן את %1 <strong>לצד</strong> מערכת הפעלה אחרת על כונן <strong>%2</strong> (%3). + להתקין את %1 <strong>לצד</strong> מערכת הפעלה אחרת על כונן <strong>%2</strong> (%3). <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - <strong>מחק</strong> כונן <strong>%2</strong> (%3) והתקן %1. + <strong>למחוק</strong> את הכונן <strong>%2</strong> (%3) ולהתקין את %1. <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. - <strong>החלף</strong> מחיצה על כונן <strong>%2</strong> (%3) עם %1. + <strong>החלפת</strong> מחיצה על כונן <strong>%2</strong> (%3) ב־%1. <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). - מגדיר מחיצות באופן <strong>ידני</strong> על כונן <strong>%1</strong>(%2). + חלוקה למחיצות באופן <strong>ידני</strong> על כונן <strong>%1</strong> (%2). @@ -1771,22 +1771,22 @@ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. - מחיצת מערכת EFI נדרשת בשביל להפעיל את %1.<br/><br/> בכדי להגדיר מחיצת מערכת EFI, חזור ובחר או צור מערכת קבצים מסוג FAT32 עם סימון <strong>esp</strong> מופעל ונקודת עיגון <strong>%2</strong>.<br/><br/> ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך המערכת יכולה להיכשל בטעינה. + מחיצת מערכת EFI נדרשת כדי להפעיל את %1.<br/><br/> כדי להגדיר מחיצת מערכת EFI, עליך לחזור ולבחור או ליצור מערכת קבצים מסוג FAT32 עם סימון <strong>esp</strong> פעיל ועם נקודת עיגון <strong>%2</strong>.<br/><br/> ניתן להמשיך ללא הגדרת מחיצת מערכת EFI אך טעינת המערכת עשויה להיכשל. EFI system partition flag not set - סימון מחיצת מערכת EFI לא מוגדר + לא מוגדר סימון מחיצת מערכת EFI An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - מחיצת מערכת EFI נדרשת להפעלת %1.<br/><br/> מחיצה הוגדרה עם נקודת עיגון <strong>%2</strong> אך סימון <strong>esp</strong> לא הוגדר.<br/> בכדי לסמן את המחיצה, חזור וערוך את המחיצה.<br/><br/> תוכל להמשיך ללא ביצוע הסימון אך המערכת יכולה להיכשל בטעינה. + לצורך הפעלת %1 נדרשת מחיצת מערכת EFI.<br/><br/> הוגדרה מחיצה עם נקודת עיגון <strong>%2</strong> אך לא הוגדר סימון <strong>esp</strong>.<br/> כדי לסמן את המחיצה, עליך לחזור ולערוך את המחיצה.<br/><br/> ניתן להמשיך ללא הוספת הסימון אך טעינת המערכת עשויה להיכשל. Boot partition not encrypted - מחיצת טעינת המערכת Boot לא מוצפנת. + מחיצת טעינת המערכת (Boot) אינה מוצפנת. @@ -1799,13 +1799,13 @@ Plasma Look-and-Feel Job - + משימת מראה ותחושה של Plasma Could not select KDE Plasma Look-and-Feel package - + לא ניתן לבחור את חבילת המראה והתחושה של KDE Plasma. @@ -1818,12 +1818,12 @@ Placeholder - שומר מקום + ממלא מקום Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. - + נא לבחור מראה ותחושה עבור שולחן העבודה KDE Plasma. ניתן גם לדלג על השלב הזה ולהגדיר מראה ותחושה לאחר הקמת המערכת. בחירה בתצורת מראה ותחושה תעניק לך תצוגה מקדימה חיה של אותה התצורה. @@ -1831,7 +1831,7 @@ Look-and-Feel - + מראה ותחושה @@ -1839,17 +1839,17 @@ Saving files for later ... - + הקבצים נשמרים להמשך… No files configured to save for later. - + לא הוגדרו קבצים לשמירה בהמשך. Not all of the configured files could be preserved. - + לא ניתן לשמר את כל הקבצים שהוגדרו. @@ -1858,39 +1858,42 @@ There was no output from the command. - + +לא היה פלט מהפקודה. Output: - + +פלט: + External command crashed. - + הפקודה החיצונית נכשלה. Command <i>%1</i> crashed. - + הפקודה <i>%1</i> קרסה. External command failed to start. - + הפעלת הפעולה החיצונית נכשלה. Command <i>%1</i> failed to start. - + הפעלת הפקודה <i>%1</i> נכשלה. Internal error when starting command. - + שגיאה פנימית בעת הפעלת פקודה. @@ -1900,22 +1903,22 @@ External command failed to finish. - + סיום הפקודה החיצונית נכשל. Command <i>%1</i> failed to finish in %2 seconds. - + הפקודה <i>%1</i> לא הסתיימה תוך %2 שניות. External command finished with errors. - + הפקודה החיצונית הסתיימה עם שגיאות. Command <i>%1</i> finished with exit code %2. - + הפקודה <i>%1</i> הסתיימה עם קוד היציאה %2. @@ -1923,28 +1926,28 @@ Default Keyboard Model - ברירת מחדל של דגם המקלדת + דגם מקלדת כבררת מחדל Default - ברירת מחדל + בררת מחדל unknown - לא מוכר/ת + לא ידוע extended - מורחב/ת + מורחבת unformatted - לא מאותחל/ת + לא מאותחלת @@ -1954,7 +1957,7 @@ Unpartitioned space or unknown partition table - הזכרון לא מחולק למחיצות או טבלת מחיצות לא מוכרת + הזכרון לא מחולק למחיצות או שטבלת המחיצות אינה מוכרת @@ -2037,27 +2040,27 @@ Gathering system information... - מלקט מידע אודות המערכת... + נאסף מידע על המערכת… has at least %1 GB available drive space - קיים לפחות %1 GB של נפח אחסון + עם %1 ג״ב של נפח אחסון לפחות There is not enough drive space. At least %1 GB is required. - נפח האחסון לא מספק. נדרש לפחות %1 GB. + נפח האחסון לא מספיק. נדרשים %1 ג״ב לפחות. has at least %1 GB working memory - קיים לפחות %1 GB של זכרון פעולה + עם %1 ג״ב של זכרון פעולה לפחות The system does not have enough working memory. At least %1 GB is required. - כמות הזכרון הנדרשת לפעולה, לא מספיקה. נדרש לפחות %1 GB. + כמות הזיכרון הנדרשת לפעולה אינה מספיקה. נדרשים %1 ג״ב לפחות. @@ -2087,7 +2090,7 @@ The screen is too small to display the installer. - גודל המסך קטן מדי בכדי להציג את מנהל ההתקנה. + גודל המסך קטן מכדי להציג את תכנית ההתקנה. @@ -2095,7 +2098,7 @@ Resize partition %1. - שנה גודל מחיצה %1. + שינוי גודל המחיצה %1. @@ -2118,12 +2121,12 @@ Scanning storage devices... - סורק התקני זכרון... + התקני אחסון נסרקים… Partitioning - מגדיר מחיצות + חלוקה למחיצות @@ -2131,17 +2134,17 @@ Set hostname %1 - הגדר שם עמדה %1 + הגדרת שם מארח %1 Set hostname <strong>%1</strong>. - הגדר שם עמדה <strong>%1</strong>. + הגדרת שם מארח <strong>%1</strong>. Setting hostname %1. - מגדיר את שם העמדה %1. + שם העמדה %1 מוגדר. @@ -2153,7 +2156,7 @@ Cannot write hostname to target system - נכשלה כתיבת שם העמדה למערכת המטרה + כתיבת שם העמדה למערכת היעד נכשלה @@ -2201,12 +2204,12 @@ Set flags on new partition. - הגדר סימונים על מחיצה חדשה. + הגדרת סימונים על מחיצה חדשה. Clear flags on partition <strong>%1</strong>. - מחק סימונים על מחיצה <strong>%1</strong>. + מחיקת סימונים מהמחיצה <strong>%1</strong>. @@ -2364,7 +2367,7 @@ %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2445,19 +2448,19 @@ Placeholder - שומר מקום + ממלא מקום <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> - <html><head/><body><p>על ידי בחירת אפשרות זו, <span style=" font-weight:600;">לא תשלח מידע כלל </span>בנושא ההתקנה שלך.</p></body></html> + <html><head/><body><p>בחירה באפשרות זו, תוביל לכך <span style=" font-weight:600;">שלא יישלח מידע כלל</span> בנוגע ההתקנה שלך.</p></body></html> TextLabel - תָּוִית טקסט + תווית טקסט @@ -2474,22 +2477,22 @@ Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. - התקנת תכונת המעקב מסייעת ל %1 לראות את כמות המשתמשים, החומרה שעליה הם מתקינים את %1 ו(באמצעות שתי האפשרויות מטה), לקבל מידע מתמשך אודות תוכנות נבחרות. בכדי לראות את המידע שיישלח, אנא לחץ על צַלְמִית העזרה לצד כל תחום. + מעקב אחר ההתקנה מסייע ל־%1 לראות כמה משתמשים במוצר שלהם, על איזו חומרה מתבצעת ההתקנה של %1, בנוסף (לשתי האפשרויות הקודמות), קבלת מידע מתחדש על יישומים מועדפים. כדי לצפות בנתונים שיישלחו, נא לשלוח על סמל העזרה שליד כל אחד מהסעיפים. By selecting this you will send information about your installation and hardware. This information will <b>only be sent once</b> after the installation finishes. - על ידי בחירת אפשרות זו יישלח מידע אודות ההתקנה והחומרה שלך. מידע זה <b>יישלח פעם אחת בלבד</b> לאחר תום הליך ההתקנה. + בחירה באפשרות זו תוביל לשליחת מידע על ההתקנה והחומרה שלך. מידע זה <b>יישלח פעם אחת בלבד</b> לאחר סיום ההתקנה. By selecting this you will <b>periodically</b> send information about your installation, hardware and applications, to %1. - על ידי בחירת אפשרות זו יישלח <b>באופן קבוע</b> מידע אודות ההתקנה, החומרה והתוכנות שלך, ל %1. + בחירה באפשרות הזאת תוביל לשליחת מידע <b>מדי פעם בפעם</b> על ההתקנה, החומרה והיישומים שלך אל %1. By selecting this you will <b>regularly</b> send information about your installation, hardware, applications and usage patterns, to %1. - על ידי בחירת אפשרות זו יישלח <b>באופן קבוע</b> מידע אודות ההתקנה, החומרה, התוכנות ודפוסי השימוש שלך, ל %1. + בחירה באפשרות זו תוביל לשליחת מידע <b>באופן קבוע</b> על ההתקנה, החומרה, היישומים ודפוסי שימוש אל %1. @@ -2510,28 +2513,28 @@ Your username contains invalid characters. Only lowercase letters and numbers are allowed. - שם העמדה מכיל ערכים לא תקינים. ניתן להשתמש אך ורק באותיות קטנות ומספרים. + שם המחשב מכיל תווים בלתי תקינים. מותר להשתמש אך ורק באותיות ובמספרים. Your hostname is too short. - שם העמדה קצר מדי. + שם המחשב קצר מדי. Your hostname is too long. - שם העמדה ארוך מדי. + שם המחשב ארוך מדי. Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. - שם העמדה מכיל ערכים לא תקינים. אך ורק אותיות, מספרים ומקפים מורשים. + שם המחשב מכיל תווים בלתי תקינים. מותר להשתמש אך ורק באותיות, במספרים ובמקפים. Your passwords do not match! - הסיסמאות לא תואמות! + הססמאות לא תואמות! @@ -2572,32 +2575,32 @@ &About - &אודות + על &אודות <h1>Welcome to the %1 installer.</h1> - <h1>ברוכים הבאים להתקנת %1.</h1> + <h1>ברוך בואך להתקנת %1.</h1> <h1>Welcome to the Calamares installer for %1.</h1> - <h1>ברוכים הבאים להתקנת Calamares עבור %1.</h1> + <h1>ברוך בואך להתקנת %1 עם Calamares.</h1> About %1 installer - אודות התקנת %1 + על אודות התקנת %1 <h1>%1</h1><br/><strong>%2<br/>for %3</strong><br/><br/>Copyright 2014-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>Copyright 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>Thanks to: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg and the <a href="https://www.transifex.com/calamares/calamares/">Calamares translators team</a>.<br/><br/><a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. - + <h1>%1</h1><br/><strong>%2<br/>עבור %3</strong><br/><br/>כל הזכויות שמורות 2014‏-2017 Teo Mrnjavac &lt;teo@kde.org&gt;<br/>כל הזכויות שמורות 2017 Adriaan de Groot &lt;groot@kde.org&gt;<br/>תודתנו נתונה ל־: Anke Boersma, Aurélien Gâteau, Kevin Kofler, Lisa Vitolo, Philip Müller, Pier Luigi Fiorini, Rohan Garg ול<a href="https://www.transifex.com/calamares/calamares/">צוות המתרגמים של Calamares</a>.<br/><br/>הפיתוח של<a href="https://calamares.io/">Calamares</a> מוגש בחסות <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - דואגים לחופש התכנה. %1 support - תמיכה ב - %1 + תמיכה ב־%1 @@ -2605,7 +2608,7 @@ Welcome - ברוכים הבאים + ברוך בואך \ No newline at end of file diff -Nru calamares-3.2.1/lang/calamares_hi.ts calamares-3.2.2/lang/calamares_hi.ts --- calamares-3.2.1/lang/calamares_hi.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_hi.ts 2018-09-04 12:03:59.000000000 +0000 @@ -4,17 +4,17 @@ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. - इस सिस्टम का <strong>boot वातावरण</strong>।<br><br>पुराने x86 सिस्टम केवल <strong>BIOS</strong> का समर्थन करते हैं।<br>आधुनिक सिस्टम आमतौर पर <strong>EFI</strong> का उपयोग करते हैं, लेकिन compatibilty मोड में शुरू होने पर BIOS के रूप में दिखाई दे सकते हैं। + इस सिस्टम का <strong>बूट वातावरण</strong>।<br><br>पुराने x86 सिस्टम केवल <strong>BIOS</strong> का समर्थन करते हैं। आधुनिक सिस्टम आमतौर पर <strong>EFI</strong> का उपयोग करते हैं, लेकिन संगतता मोड में शुरू होने पर BIOS के रूप में दिखाई दे सकते हैं । This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. - यह सिस्टम <strong>EFI</strong> boot वातावरण के साथ शुरू किया गया।<br><br>EFI वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> या <strong>systemd-boot</strong> जैसे boot loader अनुप्रयोग <strong>EFI सिस्टम विभाजन</strong> पर स्थापित करने जरूरी हैं। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको या तो इसे चुनना होगा या फिर खुद ही बनाना होगा। + यह सिस्टम <strong>EFI</strong>बूट वातावरण के साथ शुरू किया गया।<br><br>EFI वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> या <strong>systemd-boot</strong> जैसे बूट लोडर अनुप्रयोग <strong>EFI सिस्टम विभाजन</strong>पर स्थापित करने जरूरी हैं। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको या तो इसे चुनना होगा या फिर खुद ही बनाना होगा। This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. - यह सिस्टम <strong>BIOS</strong> boot वातावरण के साथ शुरू किया गया।<br><br>BIOS वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> जैसे boot loader को, या तो विभाजन की शुरुआत में या फिर <strong>Master Boot Record</strong> पर विभाजन तालिका की शुरुआत में इंस्टॉल (preferred) करना होगा। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको इसे खुद ही बनाना होगा। + यह सिस्टम <strong>BIOS</strong>बूट वातावरण के साथ शुरू किया गया।<br><br>BIOS वातावरण से स्टार्टअप विन्यस्त करने के लिए इंस्टॉलर को <strong>GRUB</strong> जैसे बूट लोडर को, या तो विभाजन की शुरुआत में या फिर <strong>Master Boot Record</strong> पर विभाजन तालिका की शुरुआत में इंस्टॉल (सुझाया जाता है) करना होगा। यह स्वत: होता है, परंतु अगर आप मैनुअल विभाजन करना चुनते है; तो आपको इसे खुद ही बनाना होगा। @@ -27,7 +27,7 @@ Boot Partition - Boot विभाजन + बूट विभाजन @@ -37,7 +37,7 @@ Do not install a boot loader - Boot loader इंस्टॉल न करें + बूट लोडर इंस्टॉल न करें @@ -50,7 +50,7 @@ Blank Page - + खाली पृष्ठ @@ -73,7 +73,7 @@ Modules - Modules + मापांक @@ -115,7 +115,7 @@ Done - हो गया + पूर्ण @@ -146,22 +146,22 @@ Working directory %1 for python job %2 is not readable. - Python job %2 के लिए कार्यरत डायरेक्टरी %1 read करने योग्य नहीं है। + Python job %2 के लिए कार्यरत डायरेक्टरी %1 रीड करने योग्य नहीं है। Bad main script file - मुख्य script फ़ाइल गलत है + मुख्य स्क्रिप्ट फ़ाइल गलत है Main script file %1 for python job %2 is not readable. - Python job %2 के लिए मुख्य script फ़ाइल %1 read करने योग्य नहीं है। + Python job %2 के लिए मुख्य स्क्रिप्ट फ़ाइल %1 रीड करने योग्य नहीं है। Boost.Python error in job "%1". - Job "%1" में Boost.Python error। + Job "%1" में Boost.Python त्रुटि। @@ -169,19 +169,19 @@ &Back - &वापस + वापस (&B) &Next - &आगे + आगे (&N) &Cancel - &रद्द करें + रद्द करें (&C) @@ -192,22 +192,22 @@ Calamares Initialization Failed - + Calamares का आरंभीकरण विफल रहा %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. - + %1 को इंस्टॉल नहीं किया जा सका। Calamares सारे विन्यस्त मापांकों को लोड करने में विफल रहा। इस समस्या का कारण लिनक्स-वितरण द्वारा Calamares के उपयोग-संबंधी कोई त्रुटि है। <br/>The following modules could not be loaded: - + <br/>निम्नलिखित मापांक लोड नहीं हो सकें : &Install - + इंस्टॉल करें (&I) @@ -224,17 +224,17 @@ &Yes - &हाँ + हाँ (&Y) &No - &नहीं + नहीं (&N) &Close - &बंद करें + बंद करें (&C) @@ -249,27 +249,27 @@ &Install now - अभी &इंस्टॉल करें + अभी इंस्टॉल करें (&I) Go &back - &वापस जाएँ + वापस जाएँ (&b) &Done - हो &गया + पूर्ण हुआ (&D) The installation is complete. Close the installer. - इंस्टॉल पूर्ण हुआ।अब इंस्टॉलर को बंद करें। + इंस्टॉल पूर्ण हुआ। अब इंस्टॉलर को बंद करें। Error - Error + त्रुटि @@ -287,7 +287,7 @@ unparseable Python error - unparseable Python error + unparseable Python त्रुटि @@ -297,7 +297,7 @@ Unfetchable Python error. - Unfetchable Python error. + Unfetchable Python त्रुटि। @@ -328,7 +328,7 @@ This program will ask you some questions and set up %2 on your computer. - यह program आपसे कुछ सवाल पूछेगा व आपके कंप्यूटर पर %2 को सेट करेगा। + यह प्रोग्राम आपसे कुछ सवाल पूछ आपके कंप्यूटर पर %2 को सेट करेगा। @@ -338,7 +338,7 @@ System requirements - सिस्टम की आवश्यकताएँ + सिस्टम इंस्टॉल हेतु आवश्यकताएँ @@ -361,7 +361,7 @@ Boot loader location: - Boot loader की location: + बूट लोडर का स्थान: @@ -371,7 +371,7 @@ Select storage de&vice: - Storage डि&वाइस चुनें : + डिवाइस चुनें (&v): @@ -414,7 +414,7 @@ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - इस storage डिवाइस पर लगता है कि कोई ऑपरेटिंग सिस्टम नहीं है। आप क्या करना चाहेंगे?<br/>आप storage डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। + इस डिवाइस पर लगता है कि कोई ऑपरेटिंग सिस्टम नहीं है। आप क्या करना चाहेंगे?<br/>आप डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। @@ -422,12 +422,12 @@ <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. - <strong>डिस्क erase करें</strong><br/>इससे चयनित storage डिवाइस पर मौजूद सारा डाटा <font color="red">delete</font> हो जाएगा। + <strong>डिस्क का सारा डाटा हटाएँ</strong><br/>इससे चयनित डिवाइस पर मौजूद सारा डाटा <font color="red">हटा</font>हो जाएगा। This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - इस storage डिवाइस पर %1 है। आप क्या करना चाहेंगे?<br/>आप storage डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। + इस डिवाइस पर %1 है। आप क्या करना चाहेंगे?<br/>आप डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। @@ -443,17 +443,17 @@ <strong>Replace a partition</strong><br/>Replaces a partition with %1. - <strong>विभाजन को बदलें</strong>एक विभाजन को %1 से बदलें। + <strong>विभाजन को बदलें</strong><br/>एक विभाजन को %1 से बदलें। This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - इस storage डिवाइस पर पहले से एक ऑपरेटिंग सिस्टम है। आप क्या करना चाहेंगे?<br/>आप storage डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। + इस डिवाइस पर पहले से एक ऑपरेटिंग सिस्टम है। आप क्या करना चाहेंगे?<br/>आप डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. - इस storage डिवाइस पर एक से अधिक ऑपरेटिंग सिस्टम है। आप क्या करना चाहेंगे?<br/>आप storage डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। + इस डिवाइस पर एक से अधिक ऑपरेटिंग सिस्टम है। आप क्या करना चाहेंगे?<br/>आप डिवाइस में किसी भी बदलाव से पहले उसकी समीक्षा व पुष्टि कर सकेंगे। @@ -461,17 +461,17 @@ Clear mounts for partitioning operations on %1 - %1 पर विभाजन कार्य हेतु mount हटाएँ + %1 पर विभाजन कार्य हेतु माउंट हटाएँ Clearing mounts for partitioning operations on %1. - %1 पर विभाजन कार्य हेतु mount हटाएँ जा रहे हैं। + %1 पर विभाजन कार्य हेतु माउंट हटाएँ जा रहे हैं। Cleared all mounts for %1 - %1 के लिए सभी mount हटा दिए गए + %1 के लिए सभी माउंट हटा दिए गए @@ -479,22 +479,22 @@ Clear all temporary mounts. - सभी अस्थायी mount हटाएँ। + सभी अस्थायी माउंट हटाएँ। Clearing all temporary mounts. - सभी अस्थायी mount हटाएँ जा रहे हैं। + सभी अस्थायी माउंट हटाएँ जा रहे हैं। Cannot get list of temporary mounts. - अस्थाई mount की सूची नहीं मिली। + अस्थाई माउंट की सूची नहीं मिली। Cleared all temporary mounts. - सभी अस्थायी mount हटा दिए गए। + सभी अस्थायी माउंट हटा दिए गए। @@ -503,7 +503,7 @@ Could not run command. - कमांड run नहीं की जा सकी। + कमांड चलाई नहीं जा सकी। @@ -534,32 +534,32 @@ MiB - MiB + MiB Partition &Type: - विभाजन का प्र&कार : + विभाजन का प्रकार (&T): &Primary - &मुख्य + मुख्य (&P) E&xtended - + विस्तृत (&x) Fi&le System: - + फ़ाइल सिस्टम (&l): LVM LV name - + LVM LV का नाम @@ -569,22 +569,22 @@ &Mount Point: - + माउंट पॉइंट (&M): Si&ze: - + आकार (&z): En&crypt - En&crypt + एन्क्रिप्ट (&c) Logical - + तार्किक @@ -599,7 +599,7 @@ Mountpoint already in use. Please select another one. - + माउंट पॉइंट पहले से उपयोग में है । कृपया दूसरा चुनें। @@ -607,22 +607,22 @@ Create new %2MB partition on %4 (%3) with file system %1. - + फ़ाइल सिस्टम %1 के साथ %4 (%3) पर नया %2MB का विभाजन बनाएँ। Create new <strong>%2MB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong>. - + फ़ाइल सिस्टम <strong>%1</strong> के साथ <strong>%4</strong> (%3) पर नया <strong>%2MB</strong> का विभाजन बनाएँ। Creating new %1 partition on %2. - + %2 पर नया %1 विभाजन बनाया जा रहा है। The installer failed to create partition on disk '%1'. - + इंस्टॉलर डिस्क '%1' पर विभाजन बनाने में विफल रहा। @@ -630,17 +630,17 @@ Create Partition Table - + विभाजन तालिका बनाएँ Creating a new partition table will delete all existing data on the disk. - + नई विभाजन तालिका बनाने से डिस्क पर मौजूद सारा डाटा हट जाएगा। What kind of partition table do you want to create? - + आप किस तरह की विभाजन तालिका बनाना चाहते हैं? @@ -650,7 +650,7 @@ GUID Partition Table (GPT) - GUID Partition Table (GPT) + GUID विभाजन तालिका (GPT) @@ -658,22 +658,22 @@ Create new %1 partition table on %2. - + %2 पर नई %1 विभाजन तालिका बनाएँ। Create new <strong>%1</strong> partition table on <strong>%2</strong> (%3). - + <strong>%2</strong> (%3) पर नई <strong>%1</strong> विभाजन तालिका बनाएँ। Creating new %1 partition table on %2. - + %2 पर नई %1 विभाजन तालिका बनाई जा रही है। The installer failed to create a partition table on %1. - + इंस्टॉलर डिस्क '%1' पर विभाजन तालिका बनाने में विफल रहा। @@ -681,37 +681,37 @@ Create user %1 - + %1 उपयोक्ता बनाएँ Create user <strong>%1</strong>. - + <strong>%1</strong> उपयोक्ता बनाएँ। Creating user %1. - + %1 उपयोक्ता बनाया जा रहा है। Sudoers dir is not writable. - + Sudoers डायरेक्टरी राइट करने योग्य नहीं है। Cannot create sudoers file for writing. - + राइट हेतु sudoers फ़ाइल नहीं बन सकती। Cannot chmod sudoers file. - + sudoers फ़ाइल chmod नहीं की जा सकती। Cannot open groups file for reading. - + रीड हेतु groups फ़ाइल खोली नहीं जा सकती। @@ -719,22 +719,22 @@ Delete partition %1. - + विभाजन %1 हटाएँ। Delete partition <strong>%1</strong>. - + विभाजन <strong>%1</strong> हटाएँ। Deleting partition %1. - + %1 विभाजन हटाया जा रहा है। The installer failed to delete partition %1. - + इंस्टॉलर विभाजन %1 को हटाने में विफल रहा । @@ -742,32 +742,32 @@ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. - + चयनित डिवाइस पर <strong>विभाजन तालिका</strong> का प्रकार।<br><br>विभाजन तालिका का प्रकार केवल विभाजन तालिका को हटा दुबारा बनाकर ही किया जा सकता है, इससे डिस्क पर मौजूद सभी डाटा नहीं नष्ट हो जाएगा।<br>अगर आप कुछ अलग नहीं चुनते तो यह इंस्टॉलर वर्तमान विभाजन तालिका उपयोग करेगा।<br>अगर सुनिश्चित नहीं है तो नए व आधुनिक सिस्टम के लिए GPT चुनें। This device has a <strong>%1</strong> partition table. - + इस डिवाइस में <strong>%1</strong> विभाजन तालिका है। This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. - + यह एक <strong>लूप</strong> डिवाइस है।<br><br>इस छद्म-डिवाइस में कोई विभाजन तालिका नहीं है जो फ़ाइल को ब्लॉक डिवाइस के रूप में उपयोग कर सकें। इस तरह के सेटअप में केवल एक फ़ाइल सिस्टम होता है। This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. - + इंस्टॉलर को चयनित डिवाइस पर <strong>कोई विभाजन तालिका नहीं मिली</strong>।<br><br> डिवाइस पर विभाजन तालिका नहीं है या फिर जो है वो ख़राब है या उसका प्रकार अज्ञात है। <br>इंस्टॉलर एक नई विभाजन तालिका, स्वतः व मैनुअल दोनों तरह से बना सकता है। <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. - + <br><br><strong>EFI</strong>वातावरण से शुरू होने वाले आधुनिक सिस्टम के लिए यही विभाजन तालिका सुझाई जाती है। <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. - + <br><br>यह विभाजन तालिका केवल <strong>BIOS</strong>वातावरण से शुरू होने वाले पुराने सिस्टम के लिए ही सुझाई जाती है। बाकी सब के लिए GPT ही सबसे उपयुक्त है।<br><br><strong>चेतावनी:</strong> MBR विभाजन तालिका MS-DOS के समय की एक पुरानी तकनीक है।<br> इसमें केवल 4 <em>मुख्य</em> विभाजन बनाये जा सकते हैं, इनमें से एक <em>विस्तृत</em> हो सकता है व इसके अंदर भी कई <em>तार्किक</em> विभाजन हो सकते हैं। @@ -793,7 +793,7 @@ Failed to open %1 - + %1 खोलने में विफल @@ -809,17 +809,17 @@ Edit Existing Partition - + मौजूदा विभाजन को संपादित करें Content: - + सामग्री : &Keep - + रखें (&K) @@ -834,22 +834,22 @@ &Mount Point: - + माउंट पॉइंट (&M): Si&ze: - + आकार (&z): MiB - MiB + MiB Fi&le System: - + फ़ाइल सिस्टम (&l): @@ -859,7 +859,7 @@ Mountpoint already in use. Please select another one. - + माउंट पॉइंट पहले से उपयोग में है । कृपया दूसरा चुनें। @@ -872,22 +872,22 @@ En&crypt system - + सिस्टम एन्क्रिप्ट करें (&E) Passphrase - + कूटशब्द Confirm passphrase - + कूटशब्द की पुष्टि करें Please enter the same passphrase in both boxes. - + कृपया दोनों स्थानों में समान कूटशब्द दर्ज करें। @@ -900,32 +900,32 @@ Install %1 on <strong>new</strong> %2 system partition. - + <strong>नए</strong> %2 सिस्टम विभाजन पर %1 इंस्टॉल करें। Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>. - + <strong>नया</strong> %2 विभाजन माउंट पॉइंट <strong>%1</strong> के साथ सेट करें। Install %2 on %3 system partition <strong>%1</strong>. - + %3 सिस्टम विभाजन <strong>%1</strong> पर %2 इंस्टॉल करें। Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>. - + %3 विभाजन <strong>%1</strong> माउंट पॉइंट <strong>%2</strong> के साथ सेट करें। Install boot loader on <strong>%1</strong>. - + बूट लोडर <strong>%1</strong> पर इंस्टॉल करें। Setting up mount points. - + माउंट पॉइंट सेट किए जा रहे हैं। @@ -938,22 +938,22 @@ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style=" font-style:italic;">Done</span> or close the installer.</p></body></html> - + <html><head/><body><p>इस विकल्प के चेक होने पर आपका सिस्टम तुरंत पुनः आरंभ हो जाएगा जब आप <span style=" font-style:italic;">हो गया</span>पर क्लिक करेंगे या इंस्टॉलर बंद करें ।</p></body></html> &Restart now - + अभी पुनः आरंभ करें (&R) <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. - + <h1>सब हो गया।</h1><br/>आपके कंप्यूटर पर %1 इंस्टॉल हो चुका है।<br/>अब आप आपने नए सिस्टम को पुनः आरंभ कर सकते है, या फिर %2 लाइव वातावरण उपयोग करना जारी रखें। <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - + <h1>इंस्टॉल विफल रहा</h1><br/>%1 आपके कंप्यूटर पर इंस्टॉल नहीं हुआ।<br/>त्रुटि संदेश : %2। @@ -961,17 +961,17 @@ Finish - + समाप्त करें Installation Complete - + इंस्टॉल पूर्ण हुआ The installation of %1 is complete. - + %1 का इंस्टॉल पूर्ण हुआ। @@ -979,22 +979,22 @@ Format partition %1 (file system: %2, size: %3 MB) on %4. - + विभाजन %1 (फ़ाइल सिस्टम: %2, आकार: %3MB) को %4 पर फॉर्मेट करें। Format <strong>%3MB</strong> partition <strong>%1</strong> with file system <strong>%2</strong>. - + फ़ाइल सिस्टम <strong>%2</strong> के साथ <strong>%3MB</strong> के विभाजन <strong>%1</strong> को फॉर्मेट करें। Formatting partition %1 with file system %2. - + फ़ाइल सिस्टम %2 के साथ विभाजन %1 को फॉर्मेट किया जा रहा है। The installer failed to format partition %1 on disk '%2'. - + इंस्टॉलर डिस्क '%2' पर विभाजन %1 को फॉर्मेट करने में विफल रहा। @@ -1002,12 +1002,12 @@ Konsole not installed - + Konsole इंस्टॉल नहीं है Please install KDE Konsole and try again! - + कृपया केडीई Konsole इंस्टॉल कर, पुनः प्रयास करें। @@ -1028,12 +1028,12 @@ Set keyboard model to %1.<br/> - + कुंजीपटल का मॉडल %1 सेट करें।<br/> Set keyboard layout to %1/%2. - + कुंजीपटल का अभिन्यास %1/%2 सेट करें। @@ -1041,7 +1041,7 @@ Keyboard - कुंजीपटल + कुंजीपटल @@ -1049,22 +1049,22 @@ System locale setting - + सिस्टम स्थानिकी सेटिंग्स The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. - + सिस्टम स्थानिकी सेटिंग कमांड लाइन के कुछ उपयोक्ता अंतरफलक तत्वों की भाषा व अक्षर सेट पर असर डालती है।<br/>मौजूदा सेटिंग है <strong>%1</strong>। &Cancel - &रद्द करें + रद्द करें (&C) &OK - + ठीक है (&O) @@ -1077,17 +1077,17 @@ I accept the terms and conditions above. - + मैं उपर्युक्त नियम व शर्तें स्वीकार करता हूँ। <h1>License Agreement</h1>This setup procedure will install proprietary software that is subject to licensing terms. - + <h1>लाइसेंस अनुबंध</h1>यह लाइसेंस शर्तों के अधीन अमुक्त सॉफ्टवेयर को इंस्टॉल करेगा। Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, the setup procedure cannot continue. - + कृपया ऊपर दिए गए लक्षित उपयोक्ता लाइसेंस अनुबंध (EULAs) ध्यानपूर्वक पढ़ें।<br/> यदि आप शर्तों से असहमत है, तो सेटअप को ज़ारी नहीं रखा जा सकता। @@ -1097,44 +1097,44 @@ Please review the End User License Agreements (EULAs) above.<br/>If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. - + कृपया ऊपर दिए गए लक्षित उपयोक्ता लाइसेंस अनुबंध (EULAs) ध्यानपूर्वक पढ़ें।<br/> यदि आप शर्तों से असहमत है, तो अमुक्त सॉफ्टवेयर इंस्टाल नहीं किया जाएगा व उनके मुक्त विकल्प उपयोग किए जाएँगे। <strong>%1 driver</strong><br/>by %2 %1 is an untranslatable product name, example: Creative Audigy driver - + <strong>%1 ड्राइवर</strong><br/>%2 द्वारा <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> %1 is usually a vendor name, example: Nvidia graphics driver - + <strong>%1 ग्राफ़िक्स ड्राइवर</strong><br/><font color="Grey">%2 द्वारा</font> <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> - + <strong>%1 ब्राउज़र प्लगिन</strong><br/><font color="Grey">%2 द्वारा</font> <strong>%1 codec</strong><br/><font color="Grey">by %2</font> - + <strong>%1 कोडेक</strong><br/><font color="Grey">%2 द्वारा</font> <strong>%1 package</strong><br/><font color="Grey">by %2</font> - + <strong>%1 पैकेज</strong><br/><font color="Grey">%2 द्वारा</font> <strong>%1</strong><br/><font color="Grey">by %2</font> - + <strong>%1</strong><br/><font color="Grey">%2 द्वारा</font> <a href="%1">view license agreement</a> - + <a href="%1">लाइसेंस अनुबंध देखें</a> @@ -1142,7 +1142,7 @@ License - + लाइसेंस @@ -1150,33 +1150,33 @@ The system language will be set to %1. - + सिस्टम भाषा %1 सेट की जाएगी। The numbers and dates locale will be set to %1. - + संख्या व दिनांक स्थानिकी %1 सेट की जाएगी। Region: - + क्षेत्र : Zone: - + क्षेत्र : &Change... - + बदलें (&C)... Set timezone to %1/%2.<br/> - + समय क्षेत्र %1%2 पर सेट करें।<br/> @@ -1190,12 +1190,12 @@ Loading location data... - + स्थान संबंधी डाटा लोड किया जा रहा है... Location - + स्थान @@ -1203,12 +1203,12 @@ Name - + नाम Description - + विवरण @@ -1226,7 +1226,7 @@ Package selection - + पैकेज चयन @@ -1234,227 +1234,227 @@ Password is too short - + कूटशब्द बहुत छोटा है Password is too long - + कूटशब्द बहुत लंबा है Password is too weak - + कूटशब्द बहुत कमज़ोर है Memory allocation error when setting '%1' - + '%1' सेट करते समय मेमोरी आवंटन त्रुटि Memory allocation error - + मेमोरी आवंटन त्रुटि The password is the same as the old one - + यह कूटशब्द पुराने वाला ही है The password is a palindrome - + कूटशब्द एक विलोमपद है The password differs with case changes only - + इसमें और पिछले कूटशब्द में केवल lower/upper case का फर्क है The password is too similar to the old one - + यह कूटशब्द पुराने वाले जैसा ही है The password contains the user name in some form - + इस कूटशब्द में किसी रूप में उपयोक्ता नाम है The password contains words from the real name of the user in some form - + इस कूटशब्द में किसी रूप में उपयोक्ता के असली नाम के शब्द शामिल है The password contains forbidden words in some form - + इस कूटशब्द में किसी रूप में वर्जित शब्द है The password contains less than %1 digits - + इस कूटशब्द में %1 से कम अंक हैं The password contains too few digits - + इस कूटशब्द में काफ़ी कम अंक हैं The password contains less than %1 uppercase letters - + इस कूटशब्द में %1 से कम uppercase अक्षर हैं The password contains too few uppercase letters - + इस कूटशब्द में काफ़ी कम uppercase अक्षर हैं The password contains less than %1 lowercase letters - + इस कूटशब्द में %1 से कम lowercase अक्षर हैं The password contains too few lowercase letters - + इस कूटशब्द में काफ़ी कम lowercase अक्षर हैं The password contains less than %1 non-alphanumeric characters - + इस कूटशब्द में %1 से कम ऐसे अक्षर हैं जो अक्षरांक नहीं हैं The password contains too few non-alphanumeric characters - + इस कूटशब्द में काफ़ी कम अक्षरांक हैं The password is shorter than %1 characters - + कूटशब्द %1 अक्षरों से छोटा है The password is too short - + कूटशब्द बहुत छोटा है The password is just rotated old one - + यह कूटशब्द पुराने वाला ही है, बस घुमा रखा है The password contains less than %1 character classes - + इस कूटशब्द में %1 से कम अक्षर classes हैं The password does not contain enough character classes - + इस कूटशब्द में नाकाफ़ी अक्षर classes हैं The password contains more than %1 same characters consecutively - + कूटशब्द में %1 से अधिक समान अक्षर लगातार हैं The password contains too many same characters consecutively - + कूटशब्द में काफ़ी ज्यादा समान अक्षर लगातार हैं The password contains more than %1 characters of the same class consecutively - + कूटशब्द में %1 से अधिक समान अक्षर classes लगातार हैं The password contains too many characters of the same class consecutively - + कूटशब्द में काफ़ी ज्यादा एक ही class के अक्षर लगातार हैं The password contains monotonic sequence longer than %1 characters - + कूटशब्द में %1 अक्षरों से लंबा monotonic अनुक्रम है The password contains too long of a monotonic character sequence - + कूटशब्द में काफ़ी बड़ा monotonic अनुक्रम है No password supplied - + कोई कूटशब्द नहीं दिया गया Cannot obtain random numbers from the RNG device - + RNG डिवाइस से यादृच्छिक अंक नहीं मिल सके Password generation failed - required entropy too low for settings - + कूटशब्द बनाना विफल रहा - सेटिंग्स के लिए आवश्यक entropy बहुत कम है The password fails the dictionary check - %1 - + कूटशब्द शब्दकोश की जाँच में विफल रहा - %1 The password fails the dictionary check - + कूटशब्द शब्दकोश की जाँच में विफल रहा Unknown setting - %1 - + अज्ञात सेटिंग- %1 Unknown setting - + अज्ञात सेटिंग Bad integer value of setting - %1 - + सेटिंग का गलत integer मान - %1 Bad integer value - + गलत integer मान Setting %1 is not of integer type - + सेटिंग %1 integer नहीं है Setting is not of integer type - + सेटिंग integer नहीं है Setting %1 is not of string type - + सेटिंग %1 string नहीं है Setting is not of string type - + सेटिंग string नहीं है Opening the configuration file failed - + विन्यास फ़ाइल खोलने में विफल @@ -1464,12 +1464,12 @@ Fatal failure - + गंभीर विफलता Unknown error - + अज्ञात त्रुटि @@ -1482,12 +1482,12 @@ Keyboard Model: - + कुंजीपटल का मॉडल Type here to test your keyboard - + अपना कुंजीपटल जाँचने के लिए यहां टाइप करें @@ -1500,64 +1500,64 @@ What is your name? - + आपका नाम क्या है? What name do you want to use to log in? - + लॉग इन के लिए आप किस नाम का उपयोग करना चाहते हैं? font-weight: normal - font-weight: normal + मुद्रलिपि-weight: सामान्य <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> - + <small>अगर इस कंप्यूटर को एक से अधिक व्यक्ति उपयोग करते हैं, तो आप इंस्टॉल के उपरांत एकाधिक अकाउंट सेट कर सकते हैं।</small> Choose a password to keep your account safe. - + अपना अकाउंट सुरक्षित रखने के लिए पासवर्ड चुनें । <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> - + <small>एक ही कूटशब्द दो बार दर्ज़ करें, ताकि उसे टाइप त्रुटि के लिए जांचा जा सके । एक अच्छे कूटशब्द में अक्षर, अंक व विराम चिन्हों का मेल होता है, उसमें कम-से-कम आठ अक्षर होने चाहिए, और उसे नियमित अंतराल पर बदलते रहना चाहिए।</small> What is the name of this computer? - + इस कंप्यूटर का नाम ? <small>This name will be used if you make the computer visible to others on a network.</small> - + <small>यदि आपका कंप्यूटर किसी नेटवर्क पर दृश्यमान होता है, तो यह नाम उपयोग किया जाएगा।</small> Log in automatically without asking for the password. - + कूटशब्द बिना पूछे ही स्वतः लॉग इन करें। Use the same password for the administrator account. - + प्रबंधक अकाउंट के लिए भी यही कूटशब्द उपयोग करें। Choose a password for the administrator account. - + प्रबंधक अकाउंट के लिए कूटशब्द चुनें। <small>Enter the same password twice, so that it can be checked for typing errors.</small> - + <small>समान कूटशब्द दो बार दर्ज करें, ताकि जाँच की जा सके कि कहीं टाइपिंग त्रुटि तो नहीं है।</small> @@ -1565,37 +1565,37 @@ Root - Root + रुट Home - + होम Boot - Boot + बूट EFI system - + EFI सिस्टम Swap - + स्वैप New partition for %1 - + %1 के लिए नया विभाजन New partition - + नया विभाजन @@ -1609,33 +1609,33 @@ Free Space - + खाली स्पेस New partition - + नया विभाजन Name - + नाम File System - + फ़ाइल सिस्टम Mount Point - + माउंट पॉइंट Size - + आकार @@ -1648,47 +1648,47 @@ Storage de&vice: - + डिवाइस (&v): &Revert All Changes - + सभी बदलाव उलट दें (&R) New Partition &Table - + नई विभाजन तालिका (&T) Cre&ate - + बनाएँ (&a) &Edit - + संपादित करें (&E) &Delete - + हटाएँ (D) Install boot &loader on: - + बूट लोडर इंस्टॉल करें (&l) : Are you sure you want to create a new partition table on %1? - + क्या आप वाकई %1 पर एक नई विभाजन तालिका बनाना चाहते हैं? Can not create new partition - + नया विभाजन नहीं बनाया जा सकता @@ -1711,47 +1711,47 @@ Install %1 <strong>alongside</strong> another operating system. - + %1 को दूसरे ऑपरेटिंग सिस्टम <strong>के साथ</strong> इंस्टॉल करें। <strong>Erase</strong> disk and install %1. - + डिस्क का सारा डाटा<strong>हटाकर</strong> कर %1 इंस्टॉल करें। <strong>Replace</strong> a partition with %1. - + विभाजन को %1 से <strong>बदलें</strong>। <strong>Manual</strong> partitioning. - + <strong>मैनुअल</strong> विभाजन। Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3). - + डिस्क <strong>%2</strong> (%3) पर %1 को दूसरे ऑपरेटिंग सिस्टम <strong>के साथ</strong> इंस्टॉल करें। <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1. - + डिस्क <strong>%2</strong> (%3) <strong>erase</strong> कर %1 इंस्टॉल करें। <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1. - + डिस्क <strong>%2</strong> (%3) के विभाजन को %1 से <strong>बदलें</strong>। <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2). - + डिस्क <strong>%1</strong> (%2) पर <strong>मैनुअल</strong> विभाजन। Disk <strong>%1</strong> (%2) - + डिस्क <strong>%1</strong> (%2) @@ -1766,32 +1766,32 @@ No EFI system partition configured - + कोई EFI सिस्टम विभाजन विन्यस्त नहीं है An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>esp</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. - + %1 को शुरू करने हेतु EFI सिस्टम विभाजन ज़रूरी है।<br/><br/>EFI सिस्टम विभाजन को विन्यस्त करने के लिए, वापस जाएँ और चुनें या बनाएँ एक FAT32 फ़ाइल सिस्टम जिस पर <strong>esp</strong> flag चालू हो व माउंट पॉइंट <strong>%2</strong>हो।<br/><br/>आप बिना सेट भी आगे बढ़ सकते है पर सिस्टम चालू नहीं होगा। EFI system partition flag not set - + EFI सिस्टम विभाजन flag सेट नहीं है An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>esp</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - + %1 को शुरू करने हेतु EFI सिस्टम विभाजन ज़रूरी है।<br/><br/>विभाजन को माउंट पॉइंट <strong>%2</strong> के साथ विन्यस्त किया गया परंतु उसका <strong>esp</strong> flag सेट नहीं था।<br/> Flag सेट करने के लिए, वापस जाएँ और विभाजन को edit करें।<br/><br/>आप बिना सेट भी आगे बढ़ सकते है पर सिस्टम चालू नहीं होगा। Boot partition not encrypted - + बूट विभाजन एन्क्रिप्टेड नहीं है A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. - + एन्क्रिप्टेड रुट विभाजन के साथ एक अलग बूट विभाजन भी सेट किया गया था, पर बूट विभाजन एन्क्रिप्टेड नहीं था।<br/><br/> इस तरह का सेटअप सुरक्षित नहीं होता क्योंकि सिस्टम फ़ाइल एन्क्रिप्टेड विभाजन पर होती हैं।<br/>आप चाहे तो जारी रख सकते है, पर फिर फ़ाइल सिस्टम बाद में सिस्टम स्टार्टअप के दौरान अनलॉक होगा।<br/> विभाजन को एन्क्रिप्ट करने के लिए वापस जाकर उसे दोबारा बनाएँ व विभाजन निर्माण विंडो में<strong>एन्क्रिप्ट</strong> चुनें। @@ -1799,13 +1799,13 @@ Plasma Look-and-Feel Job - Plasma Look-and-Feel Job + प्लाज़्मा Look-and-Feel Job Could not select KDE Plasma Look-and-Feel package - + KDE प्लाज़्मा का Look-and-Feel पैकेज चुना नहीं जा सका @@ -1823,7 +1823,7 @@ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. - + कृपया KDE प्लाज़्मा डेस्कटॉप के लिए एक look-and-feel चुनें। आप अभी इस चरण को छोड़ सकते हैं व सिस्टम इंस्टॉल हो जाने के बाद इसे सेट कर सकते हैं। look-and-feel विकल्पों पर क्लिक कर आप चयनित look-and-feel का तुरंत ही पूर्वावलोकन कर सकते हैं। @@ -1831,7 +1831,7 @@ Look-and-Feel - + Look-and-Feel @@ -1858,64 +1858,67 @@ There was no output from the command. - + +कमांड से कोई आउटपुट नहीं मिला। Output: - + +आउटपुट: + External command crashed. - + बाह्य कमांड क्रैश हो गई। Command <i>%1</i> crashed. - + कमांड <i>%1</i> क्रैश हो गई। External command failed to start. - + बाह्य​ कमांड शुरू होने में विफल। Command <i>%1</i> failed to start. - + कमांड <i>%1</i> शुरू होने में विफल। Internal error when starting command. - + कमांड शुरू करते समय आंतरिक त्रुटि। Bad parameters for process job call. - + प्रक्रिया कार्य कॉल के लिए गलत मापदंड। External command failed to finish. - + बाहरी कमांड समाप्त करने में विफल। Command <i>%1</i> failed to finish in %2 seconds. - + कमांड <i>%1</i> %2 सेकंड में समाप्त होने में विफल। External command finished with errors. - + बाहरी कमांड त्रुटि के साथ समाप्त। Command <i>%1</i> finished with exit code %2. - + कमांड <i>%1</i> exit कोड %2 के साथ समाप्त। @@ -1923,18 +1926,18 @@ Default Keyboard Model - + डिफ़ॉल्ट कुंजीपटल मॉडल Default - + डिफ़ॉल्ट unknown - + अज्ञात @@ -1949,12 +1952,12 @@ swap - + स्वैप Unpartitioned space or unknown partition table - + अविभाजित स्पेस या अज्ञात विभाजन तालिका @@ -1967,59 +1970,59 @@ Select where to install %1.<br/><font color="red">Warning: </font>this will delete all files on the selected partition. - + चुनें कि %1 को कहाँ इंस्टॉल करना है।<br/><font color="red">चेतावनी: </font> यह चयनित विभाजन पर मौजूद सभी फ़ाइलों को हटा देगा। The selected item does not appear to be a valid partition. - + चयनित आइटम एक मान्य विभाजन नहीं है। %1 cannot be installed on empty space. Please select an existing partition. - + %1 को खाली स्पेस पर इंस्टॉल नहीं किया जा सकता।कृपया कोई मौजूदा विभाजन चुनें। %1 cannot be installed on an extended partition. Please select an existing primary or logical partition. - + %1 को विस्तृत विभाजन पर इंस्टॉल नहीं किया जा सकता।कृपया कोई मौजूदा मुख्य या तार्किक विभाजन चुनें। %1 cannot be installed on this partition. - + इस विभाजन पर %1 इंस्टॉल नहीं किया जा सकता। Data partition (%1) - + डाटा विभाजन (%1) Unknown system partition (%1) - + अज्ञात सिस्टम विभाजन (%1) %1 system partition (%2) - + %1 सिस्टम विभाजन (%2) <strong>%4</strong><br/><br/>The partition %1 is too small for %2. Please select a partition with capacity at least %3 GiB. - + <strong>%4</strong><br/><br/>%2 के लिए विभाजन %1 बहुत छोटा है।कृपया कम-से-कम %3 GiB की क्षमता वाला कोई विभाजन चुनें । <strong>%2</strong><br/><br/>An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. - + <strong>%2</strong><br/><br/>इस सिस्टम पर कहीं भी कोई EFI सिस्टम विभाजन नहीं मिला। कृपया वापस जाएँ व %1 को सेट करने के लिए मैनुअल रूप से विभाजन करें। <strong>%3</strong><br/><br/>%1 will be installed on %2.<br/><font color="red">Warning: </font>all data on partition %2 will be lost. - + <strong>%3</strong><br/><br/>%2 पर %1 इंस्टॉल किया जाएगा।<br/><font color="red">चेतावनी : </font>विभाजन %2 पर मौजूद सारा डाटा हटा दिया जाएगा। @@ -2042,52 +2045,52 @@ has at least %1 GB available drive space - + %1GB स्पेस ड्राइव पर उपलब्ध है There is not enough drive space. At least %1 GB is required. - + ड्राइव में पर्याप्त स्पेस नहीं है। कम-से-कम %1GB होना ज़रूरी है। has at least %1 GB working memory - + %1GB मेमोरी है The system does not have enough working memory. At least %1 GB is required. - + सिस्टम में पर्याप्त मेमोरी नहीं है। कम-से-कम %1GB होनी ज़रूरी है। is plugged in to a power source - + बिजली से कनेक्ट है। The system is not plugged in to a power source. - + सिस्टम बिजली से कनेक्ट नहीं है। is connected to the Internet - + इंटरनेट से कनेक्ट है। The system is not connected to the Internet. - + सिस्टम इंटरनेट से कनेक्ट नहीं है। The installer is not running with administrator rights. - + इंस्टॉलर के पास प्रबंधक अधिकार नहीं है। The screen is too small to display the installer. - + इंस्टॉलर दिखाने के लिए स्क्रीन बहुत छोटी है। @@ -2095,22 +2098,22 @@ Resize partition %1. - + विभाजन %1 का आकार बदलें। Resize <strong>%2MB</strong> partition <strong>%1</strong> to <strong>%3MB</strong>. - + <strong>%2MB</strong> के <strong>%1</strong> विभाजन का आकार बदलकर <strong>%3MB</strong> किया जा रहा है। Resizing %2MB partition %1 to %3MB. - + %2MB के %1 विभाजन का आकार बदलकर %3MB किया जा रहा है। The installer failed to resize partition %1 on disk '%2'. - + इंस्टॉलर डिस्क '%2' पर विभाजन %1 का आकर बदलने में विफल रहा। @@ -2118,12 +2121,12 @@ Scanning storage devices... - + डिवाइस स्कैन किए जा रहे हैं... Partitioning - + विभाजन @@ -2131,29 +2134,29 @@ Set hostname %1 - + होस्ट नाम %1 सेट करें। Set hostname <strong>%1</strong>. - + होस्ट नाम <strong>%1</strong> सेट करें। Setting hostname %1. - + होस्ट नाम %1 सेट हो रहा है। Internal Error - + आंतरिक त्रुटि Cannot write hostname to target system - + लक्षित सिस्टम पर होस्ट नाम लिखा नहीं जा सकता। @@ -2161,29 +2164,29 @@ Set keyboard model to %1, layout to %2-%3 - + कुंजीपटल का मॉडल %1, अभिन्यास %2-%3 सेट करें। Failed to write keyboard configuration for the virtual console. - + Virtual console हेतु कुंजीपटल की सेटिंग्स राइट करने में विफल रहा। Failed to write to %1 - + %1 पर राइट करने में विफल Failed to write keyboard configuration for X11. - + X11 हेतु कुंजीपटल की सेटिंग्स राइट करने में विफल रहा। Failed to write keyboard configuration to existing /etc/default directory. - + मौजूदा /etc /default डायरेक्टरी में कुंजीपटल की सेटिंग्स write करने में विफल रहा। @@ -2191,82 +2194,82 @@ Set flags on partition %1. - + %1 विभाजन पर flag सेट करें। Set flags on %1MB %2 partition. - + %1MB के %2 विभाजन पर flag सेट करें। Set flags on new partition. - + नए विभाजन पर flag सेट करें। Clear flags on partition <strong>%1</strong>. - + <strong>%1</strong> विभाजन पर से flag हटाएँ। Clear flags on %1MB <strong>%2</strong> partition. - + %1MB के <strong>%2</strong> विभाजन पर से flag हटाएँ। Clear flags on new partition. - + नए विभाजन पर से flag हटाएँ। Flag partition <strong>%1</strong> as <strong>%2</strong>. - + <strong>%1</strong> विभाजन पर <strong>%2</strong> का flag लगाएँ। Flag %1MB <strong>%2</strong> partition as <strong>%3</strong>. - + %1MB के <strong>%2</strong> विभाजन पर <strong>%3</strong> का flag लगाएँ। Flag new partition as <strong>%1</strong>. - + नए विभाजन पर<strong>%1</strong>का flag लगाएँ। Clearing flags on partition <strong>%1</strong>. - + <strong>%1</strong> विभाजन पर से flag हटाएँ जा रहे हैं। Clearing flags on %1MB <strong>%2</strong> partition. - + %1MB के <strong>%2</strong> विभाजन पर से flag हटाएँ जा रहे हैं। Clearing flags on new partition. - + नए विभाजन पर से flag हटाएँ जा रहे हैं। Setting flags <strong>%2</strong> on partition <strong>%1</strong>. - + <strong>%1</strong> विभाजन पर flag <strong>%2</strong> सेट किए जा रहे हैं। Setting flags <strong>%3</strong> on %1MB <strong>%2</strong> partition. - + %1MB के <strong>%2</strong> विभाजन पर flag <strong>%3</strong> सेट किए जा रहे हैं। Setting flags <strong>%1</strong> on new partition. - + नए विभाजन पर flag <strong>%1</strong> सेट किए जा रहे हैं। The installer failed to set flags on partition %1. - + इंस्टॉलर विभाजन %1 पर flag सेट करने में विफल रहा। @@ -2274,42 +2277,42 @@ Set password for user %1 - + उपयोक्ता %1 के लिए पासवर्ड सेट करें। Setting password for user %1. - + उपयोक्ता %1 के लिए पासवर्ड सेट किया जा रहा है। Bad destination system path. - + लक्ष्य का सिस्टम पथ गलत है। rootMountPoint is %1 - + rootMountPoint %1 है Cannot disable root account. - + रुट अकाउंट निष्क्रिय नहीं किया जा सकता । passwd terminated with error code %1. - + passwd त्रुटि कोड %1 के साथ समाप्त। Cannot set password for user %1. - + उपयोक्ता %1 के लिए पासवर्ड सेट नहीं किया जा सकता। usermod terminated with error code %1. - + usermod त्रुटि कोड %1 के साथ समाप्त। @@ -2317,37 +2320,37 @@ Set timezone to %1/%2 - + समय क्षेत्र %1%2 पर सेट करें Cannot access selected timezone path. - + चयनित समय क्षेत्र पथ तक पहुँचा नहीं जा सका। Bad path: %1 - + गलत पथ: %1 Cannot set timezone. - + समय क्षेत्र सेट नहीं हो सका। Link creation failed, target: %1; link name: %2 - + लिंक बनाना विफल, लक्ष्य: %1; लिंक का नाम: %2 Cannot set timezone, - + समय क्षेत्र सेट नहीं हो सका। Cannot open /etc/timezone for writing - + राइट करने हेतु /etc /timezone खोला नहीं जा सका। @@ -2364,7 +2367,7 @@ %L1 / %L2 slide counter, %1 of %2 (numeric) - + %L1 / %L2 @@ -2372,7 +2375,7 @@ This is an overview of what will happen once you start the install procedure. - + यह अवलोकन है कि इंस्टॉल शुरू होने के बाद क्या होगा। @@ -2380,7 +2383,7 @@ Summary - सारांश + सार @@ -2505,33 +2508,33 @@ Your username is too long. - + आपका उपयोक्ता नाम बहुत लंबा है। Your username contains invalid characters. Only lowercase letters and numbers are allowed. - + आपके होस्ट नाम में अमान्य अक्षर हैं । केवल lowercase अक्षरों व संख्याओं की ही अनुमति है । Your hostname is too short. - + आपका होस्ट नाम बहुत छोटा है। Your hostname is too long. - + आपका होस्ट नाम बहुत लंबा है। Your hostname contains invalid characters. Only letters, numbers and dashes are allowed. - + आपके होस्ट नाम में अमान्य अक्षर हैं । केवल अक्षरों, संख्याओं व dash की ही अनुमति है । Your passwords do not match! - + आपके कूटशब्द मेल नहीं खाते! @@ -2539,7 +2542,7 @@ Users - + उपयोक्ता @@ -2552,27 +2555,27 @@ &Language: - + भाषा (&L): &Release notes - + रिलीज़ नोट्स (&R) &Known issues - + ज्ञात समस्याएँ (&K) &Support - + सहायता (&S) &About - + बारे में (&A) @@ -2605,7 +2608,7 @@ Welcome - स्वागतं + स्वागतं \ No newline at end of file diff -Nru calamares-3.2.1/lang/calamares_is.ts calamares-3.2.2/lang/calamares_is.ts --- calamares-3.2.1/lang/calamares_is.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_is.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Auð síða @@ -356,7 +356,7 @@ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. - <strong>Handvirk disksneiðing</strong><br/>Þú getur búið til eða breytt stærð disksneiða sjálf(ur). + <strong>Handvirk disksneiðing</strong><br/>Þú getur búið til eða breytt stærð disksneiða sjálft. @@ -1469,7 +1469,7 @@ Unknown error - + Óþekkt villa @@ -2582,7 +2582,7 @@ <h1>Welcome to the Calamares installer for %1.</h1> - <h1>Velkomin(n) til Calamares uppsetningar fyrir %1</h1> + <h1>Velkomin til Calamares uppsetningar fyrir %1</h1> diff -Nru calamares-3.2.1/lang/calamares_it_IT.ts calamares-3.2.2/lang/calamares_it_IT.ts --- calamares-3.2.1/lang/calamares_it_IT.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_it_IT.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Pagina Vuota @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Inizializzazione di Calamares Fallita %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. - + %1 non può essere installato. Calamares non è stato in grado di caricare tutti i moduli configurati. Questo è un problema del modo in cui Calamares viene utilizzato dalla distribuzione. <br/>The following modules could not be loaded: - + <br/>Non è stato possibile caricare il seguente modulo: @@ -1663,7 +1663,7 @@ Cre&ate - + Crea diff -Nru calamares-3.2.1/lang/calamares_ja.ts calamares-3.2.2/lang/calamares_ja.ts --- calamares-3.2.1/lang/calamares_ja.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_ja.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + 空白のページ @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Calamares によるインストールに失敗しました。 %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. - + %1 はインストールできません。Calamares は全てのモジュールをロードすることをできませんでした。これは、Calamares のこのディストリビューションでの使用法による問題です。 <br/>The following modules could not be loaded: - + <br/>以下のモジュールがロードできませんでした。: @@ -508,12 +508,12 @@ The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + コマンドがホスト環境で実行される際、rootのパスの情報が必要になりますが、root のマウントポイントが定義されていません。 The command needs to know the user's name, but no username is defined. - + ユーザー名が必要ですが、定義されていません。 @@ -1664,7 +1664,7 @@ Cre&ate - + 作成(&a) @@ -1689,12 +1689,12 @@ Can not create new partition - + 新しいパーティションを作成できません The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. - + %1 上のパーティションテーブルには既にプライマリパーティション %2 が配置されており、追加することができません。プライマリパーティションを消去して代わりに拡張パーティションを追加してください。 @@ -1840,17 +1840,17 @@ Saving files for later ... - + 後でファイルを保存する... No files configured to save for later. - + 保存するための設定ファイルがありません。 Not all of the configured files could be preserved. - + 設定ファイルは全て保護されるわけではありません。 diff -Nru calamares-3.2.1/lang/calamares_ko.ts calamares-3.2.2/lang/calamares_ko.ts --- calamares-3.2.1/lang/calamares_ko.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_ko.ts 2018-09-04 12:03:59.000000000 +0000 @@ -4,17 +4,17 @@ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. - + 이 시스템의 <strong>부트 환경</strong>입니다. <br> <br> 오래된 x86 시스템은 <strong>BIOS</strong>만을 지원합니다. <br> 최근 시스템은 주로 <strong>EFI</strong>을(를) 사용하지만, 호환 모드로 시작한 경우 BIOS로 나타날 수도 있습니다. This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. - + 이 시스템은 <strong>EFI</strong> 부트 환경에서 시동되었습니다. <br> <br> EFI 환경에서의 시동에 대해 설정하려면, <strong>EFI 시스템 파티션</strong>에 <strong>GRUB</strong>나 <strong>systemd-boot</strong>와 같은 부트 로더 애플리케이션을 배치해야 합니다. 이 과정은 자동으로 진행됩니다. 단, 수동 파티셔닝을 선택할 경우, EFI 시스템 파티션을 직접 선택 또는 작성해야 합니다. This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. - + 이 시스템은 <strong>BIOS 부트 환경</strong>에서 시동되었습니다. <br> <br> BIOS 환경에서의 시동에 대해 설정하려면, 파티션의 시작 위치 또는 파티션 테이블의 시작 위치 근처(권장)에 있는 <strong>마스터 부트 레코드</strong>에 <strong>GRUB</strong>과 같은 부트 로더를 설치해야 합니다. 이 과정은 자동으로 진행됩니다. 단, 수동 파티셔닝을 선택할 경우, 사용자가 직접 설정을 해야 합니다. @@ -50,7 +50,7 @@ Blank Page - + 빈 페이지 @@ -58,7 +58,7 @@ Form - + 형식 @@ -84,7 +84,7 @@ none - + 없음 @@ -123,12 +123,12 @@ Run command %1 %2 - + 커맨드 %1 %2 실행 Running command %1 %2 - + 커맨드 %1 %2 실행 중 @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Calamares 초기화 실패 %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. - + %1 이(가) 설치될 수 없습니다. Calamares가 모든 구성된 모듈을 불러올 수 없었습니다. 이것은 Calamares가 분포에 의해 사용되는 방식에서 비롯된 문제입니다. <br/>The following modules could not be loaded: - + 다음 모듈 불러오기 실패: @@ -244,7 +244,7 @@ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> - + %1 인스톨러가 %2를 설치하기 위해 사용자의 디스크의 내용을 변경하려고 합니다. <br/> <strong>이 변경 작업은 되돌릴 수 없습니다.</strong> @@ -346,7 +346,7 @@ Form - + 형식 @@ -867,7 +867,7 @@ Form - + 형식 @@ -933,7 +933,7 @@ Form - + 형식 @@ -1072,7 +1072,7 @@ Form - + 형식 @@ -1477,7 +1477,7 @@ Form - + 형식 @@ -1495,7 +1495,7 @@ Form - + 형식 @@ -1643,7 +1643,7 @@ Form - + 형식 @@ -1813,7 +1813,7 @@ Form - + 형식 @@ -1965,7 +1965,7 @@ Form - + 형식 @@ -2443,7 +2443,7 @@ Form - + 형식 @@ -2550,7 +2550,7 @@ Form - + 형식 diff -Nru calamares-3.2.1/lang/calamares_pl.ts calamares-3.2.2/lang/calamares_pl.ts --- calamares-3.2.1/lang/calamares_pl.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_pl.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Pusta strona @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Błąd inicjacji programu Calamares %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. - + %1 nie może zostać zainstalowany. Calamares nie mógł wczytać wszystkich skonfigurowanych modułów. Jest to problem ze sposobem, w jaki Calamares jest używany przez dystrybucję. <br/>The following modules could not be loaded: - + <br/>Następujące moduły nie mogły zostać wczytane: @@ -1663,7 +1663,7 @@ Cre&ate - + Ut_wórz diff -Nru calamares-3.2.1/lang/calamares_pt_BR.ts calamares-3.2.2/lang/calamares_pt_BR.ts --- calamares-3.2.1/lang/calamares_pt_BR.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_pt_BR.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Página em Branco @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Falha na inicialização do Calamares %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. - + %1 não pôde ser instalado. O Calamares não conseguiu carregar todos os módulos configurados. Este é um problema com o modo em que o Calamares está sendo utilizado pela distribuição. <br/>The following modules could not be loaded: - + <br/>Os seguintes módulos não puderam ser carregados: @@ -259,7 +259,7 @@ &Done - Completa&do + Concluí&do @@ -318,14 +318,12 @@ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. <a href="#details">Details...</a> - Este computador não satisfaz os requisitos mínimos para instalar %1. -A instalação não pode continuar.<a href="#details">Detalhes...</a> + Este computador não satisfaz os requisitos mínimos para instalar %1.<br/>A instalação não pode continuar. <a href="#details">Detalhes...</a> This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. - Este computador não satisfaz alguns dos requisitos recomendados para instalar %1. -A instalação pode continuar, mas alguns recursos podem ser desativados. + Este computador não satisfaz alguns dos requisitos recomendados para instalar %1.<br/>A instalação pode continuar, mas alguns recursos podem ser desativados. @@ -515,7 +513,7 @@ The command needs to know the user's name, but no username is defined. - + O comando precisa saber do nome do usuário, mas nenhum nome de usuário foi definido. @@ -912,7 +910,7 @@ Install %2 on %3 system partition <strong>%1</strong>. - Instalar %2 em partição %3 do sistema <strong>%1</strong>. + Instalar %2 na partição %3 do sistema <strong>%1</strong>. @@ -1519,7 +1517,7 @@ <small>If more than one person will use this computer, you can set up multiple accounts after installation.</small> - <small>Se mais de uma pessoa utilizará este computador, você pode definir múltiplas contas após a instalação.</small> + <small>Se mais de uma pessoa utilizará este computador, você poderá definir múltiplas contas após a instalação.</small> @@ -1665,7 +1663,7 @@ Cre&ate - + Cri&ar @@ -1841,17 +1839,17 @@ Saving files for later ... - + Salvando arquivos para mais tarde... No files configured to save for later. - + Nenhum arquivo configurado para ser salvo mais tarde. Not all of the configured files could be preserved. - + Nem todos os arquivos configurados puderam ser preservados. diff -Nru calamares-3.2.1/lang/calamares_ru.ts calamares-3.2.2/lang/calamares_ru.ts --- calamares-3.2.1/lang/calamares_ru.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_ru.ts 2018-09-04 12:03:59.000000000 +0000 @@ -50,7 +50,7 @@ Blank Page - + Пустая страница @@ -192,17 +192,17 @@ Calamares Initialization Failed - + Ошибка инициализации Calamares %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. - + Не удалось установить %1. Calamares не удалось загрузить все сконфигурированные модули. Эта проблема вызвана тем, как ваш дистрибутив использует Calamares. <br/>The following modules could not be loaded: - + <br/>Не удалось загрузить следующие модули: @@ -507,12 +507,12 @@ The command runs in the host environment and needs to know the root path, but no rootMountPoint is defined. - + Команда выполняется в окружении установщика, и ей необходимо знать путь корневого раздела, но rootMountPoint не определено. The command needs to know the user's name, but no username is defined. - + Команде необходимо знать имя пользователя, но оно не задано. @@ -558,7 +558,7 @@ LVM LV name - + Имя LV LVM @@ -937,7 +937,7 @@ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style=" font-style:italic;">Done</span> or close the installer.</p></body></html> - + <html><head/><body><p>Если этот флажок установлен, ваша система будет перезагружена сразу после нажатия кнопки <span style=" font-style:italic;">Готово</span> или закрытия инсталлятора.</p></body></html> @@ -952,7 +952,7 @@ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. - + <h1>Сбой установки</h1><br/>Не удалось установить %1 на ваш компьютер.<br/>Сообщение об ошибке: %2. @@ -1063,7 +1063,7 @@ &OK - + &ОК @@ -1217,7 +1217,7 @@ Network Installation. (Disabled: Received invalid groups data) - + Установка по сети. (Отключено: получены неверные сведения о группах) @@ -1248,12 +1248,12 @@ Memory allocation error when setting '%1' - + Ошибка выделения памяти при установке «%1» Memory allocation error - + Ошибка выделения памяти @@ -1343,7 +1343,7 @@ The password is just rotated old one - + Новый пароль — это просто перевёрнутый старый @@ -1413,12 +1413,12 @@ Unknown setting - %1 - + Неизвестная настройка - %1 Unknown setting - + Неизвестная настройка @@ -1428,27 +1428,27 @@ Bad integer value - + Недопустимое целое значение Setting %1 is not of integer type - + Настройка %1 не является целым числом Setting is not of integer type - + Настройка не является целым числом Setting %1 is not of string type - + Настройка %1 не является строкой Setting is not of string type - + Настройка не является строкой @@ -1458,12 +1458,12 @@ The configuration file is malformed - + Ошибка в структуре конфигурационного файла Fatal failure - + Фатальный сбой @@ -1662,7 +1662,7 @@ Cre&ate - + Со&здать @@ -1804,7 +1804,7 @@ Could not select KDE Plasma Look-and-Feel package - + Не удалось выбрать пакет внешнего вида для KDE Plasma @@ -1822,7 +1822,7 @@ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. - + Выберите внешний вид окружения KDE Plasma. Вы можете пропустить этот шаг, и настроить его после установки системы. Щелкните на выборе внешнего вида, чтобы увидеть, как он будет выглядеть. @@ -1830,7 +1830,7 @@ Look-and-Feel - + Внешний вид @@ -1906,7 +1906,7 @@ Command <i>%1</i> failed to finish in %2 seconds. - + Команда <i>%1</i> не завершилась за %2 с. @@ -2404,7 +2404,7 @@ HTTP request timed out. - + Тайм-аут запроса HTTP. @@ -2428,12 +2428,12 @@ Could not configure machine feedback correctly, script error %1. - + Не удалось настроить отзывы о компьютере, ошибка сценария %1. Could not configure machine feedback correctly, Calamares error %1. - + Не удалось настроить отзывы о компьютере, ошибка Calamares %1. @@ -2451,7 +2451,7 @@ <html><head/><body><p>By selecting this, you will send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> - + <html><head/><body><p>Если вы это выберете, то не будет отправлено <span style=" font-weight:600;">никаких</span> сведений об установке.</p></body></html> @@ -2470,12 +2470,12 @@ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> - + <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Щелкните здесь чтобы узнать больше об отзывах пользователей</span></a></p></body></html> Install tracking helps %1 to see how many users they have, what hardware they install %1 to and (with the last two options below), get continuous information about preferred applications. To see what will be sent, please click the help icon next to each area. - + Отслеживание установок позволяет %1 узнать, сколько у них пользователей, на каком оборудовании устанавливается %1, и (с двумя последними опциями) постоянно получать сведения о предпочитаемых приложениях. Чтобы увидеть, что будет отправлено, щелкните по значку справки рядом с каждой областью. @@ -2498,7 +2498,7 @@ Feedback - + Отзывы diff -Nru calamares-3.2.1/lang/calamares_uk.ts calamares-3.2.2/lang/calamares_uk.ts --- calamares-3.2.1/lang/calamares_uk.ts 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/calamares_uk.ts 2018-09-04 12:03:59.000000000 +0000 @@ -1007,7 +1007,7 @@ Please install KDE Konsole and try again! - + Будь ласка встановіть KDE Konsole і спробуйте знову! @@ -1244,7 +1244,7 @@ Password is too weak - + Пароль надто ненадійний @@ -1254,12 +1254,12 @@ Memory allocation error - + Помилка виділення пам'яті The password is the same as the old one - + Цей пароль такий же як і старий @@ -1274,17 +1274,18 @@ The password is too similar to the old one - + Цей пароль надто схожий на попередній The password contains the user name in some form - + Цей пароль якимось чином містить ім'я користувача + The password contains words from the real name of the user in some form - + Цей пароль містить слова зі справжнього імені користувача в якійсь із форм @@ -1294,12 +1295,12 @@ The password contains less than %1 digits - + Цей пароль містить менше ніж %1 символ The password contains too few digits - + Цей пароль містить замало символів @@ -1339,7 +1340,7 @@ The password is too short - + Цей пароль занадто короткий @@ -1464,12 +1465,12 @@ Fatal failure - + Фатальна помилка Unknown error - + Невідома помилка @@ -1839,7 +1840,7 @@ Saving files for later ... - + Збереження файлів на потім ... Binary files /tmp/tmpwCRwwi/nILc878j4a/calamares-3.2.1/lang/python/es/LC_MESSAGES/python.mo and /tmp/tmpwCRwwi/PZJg37wy9E/calamares-3.2.2/lang/python/es/LC_MESSAGES/python.mo differ diff -Nru calamares-3.2.1/lang/python/es/LC_MESSAGES/python.po calamares-3.2.2/lang/python/es/LC_MESSAGES/python.po --- calamares-3.2.1/lang/python/es/LC_MESSAGES/python.po 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/python/es/LC_MESSAGES/python.po 2018-09-04 12:03:59.000000000 +0000 @@ -10,7 +10,7 @@ "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-06-18 07:46-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: strel, 2017\n" +"Last-Translator: Francisco Sánchez López de Lerma , 2018\n" "Language-Team: Spanish (https://www.transifex.com/calamares/teams/20061/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,7 +20,7 @@ #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "Desmontar sistemas de archivos." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." Binary files /tmp/tmpwCRwwi/nILc878j4a/calamares-3.2.1/lang/python/he/LC_MESSAGES/python.mo and /tmp/tmpwCRwwi/PZJg37wy9E/calamares-3.2.2/lang/python/he/LC_MESSAGES/python.mo differ diff -Nru calamares-3.2.1/lang/python/he/LC_MESSAGES/python.po calamares-3.2.2/lang/python/he/LC_MESSAGES/python.po --- calamares-3.2.1/lang/python/he/LC_MESSAGES/python.po 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/python/he/LC_MESSAGES/python.po 2018-09-04 12:03:59.000000000 +0000 @@ -10,7 +10,7 @@ "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-06-18 07:46-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Eli Shleifer , 2017\n" +"Last-Translator: Yaron Shahrabani , 2017\n" "Language-Team: Hebrew (https://www.transifex.com/calamares/teams/20061/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,7 +20,7 @@ #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "ניתוק עיגון מערכות קבצים." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." @@ -32,31 +32,31 @@ #: src/modules/machineid/main.py:35 msgid "Generate machine-id." -msgstr "חולל מספר סידורי של המכונה." +msgstr "לייצר מספר סידורי של המכונה." #: src/modules/packages/main.py:62 #, python-format msgid "Processing packages (%(count)d / %(total)d)" -msgstr "מעבד חבילות (%(count)d/%(total)d)" +msgstr "החבילות מעובדות (%(count)d/%(total)d)" #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "התקן חבילות." +msgstr "התקנת חבילות." #: src/modules/packages/main.py:67 #, python-format msgid "Installing one package." msgid_plural "Installing %(num)d packages." -msgstr[0] "מתקין חבילה אחת." -msgstr[1] "מתקין %(num)d חבילות." -msgstr[2] "מתקין %(num)d חבילות." -msgstr[3] "מתקין %(num)d חבילות." +msgstr[0] "מותקנת חבילה אחת." +msgstr[1] "מותקנות %(num)d חבילות." +msgstr[2] "מותקנות %(num)d חבילות." +msgstr[3] "מותקנות %(num)d חבילות." #: src/modules/packages/main.py:70 #, python-format msgid "Removing one package." msgid_plural "Removing %(num)d packages." -msgstr[0] "מסיר חבילה אחת." -msgstr[1] "מסיר %(num)d חבילות." -msgstr[2] "מסיר %(num)d חבילות." -msgstr[3] "מסיר %(num)d חבילות." +msgstr[0] "מתבצעת הסרה של חבילה אחת." +msgstr[1] "מתבצעת הסרה של %(num)d חבילות." +msgstr[2] "מתבצעת הסרה של %(num)d חבילות." +msgstr[3] "מתבצעת הסרה של %(num)d חבילות." Binary files /tmp/tmpwCRwwi/nILc878j4a/calamares-3.2.1/lang/python/is/LC_MESSAGES/python.mo and /tmp/tmpwCRwwi/PZJg37wy9E/calamares-3.2.2/lang/python/is/LC_MESSAGES/python.mo differ diff -Nru calamares-3.2.1/lang/python/is/LC_MESSAGES/python.po calamares-3.2.2/lang/python/is/LC_MESSAGES/python.po --- calamares-3.2.1/lang/python/is/LC_MESSAGES/python.po 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/python/is/LC_MESSAGES/python.po 2018-09-04 12:03:59.000000000 +0000 @@ -20,19 +20,19 @@ #: src/modules/umount/main.py:40 msgid "Unmount file systems." -msgstr "" +msgstr "Aftengja skráarkerfi." #: src/modules/dummypython/main.py:44 msgid "Dummy python job." -msgstr "Dummy python job." +msgstr "" #: src/modules/dummypython/main.py:97 msgid "Dummy python step {}" -msgstr "Dummy python step {}" +msgstr "" #: src/modules/machineid/main.py:35 msgid "Generate machine-id." -msgstr "Generate machine-id." +msgstr "" #: src/modules/packages/main.py:62 #, python-format Binary files /tmp/tmpwCRwwi/nILc878j4a/calamares-3.2.1/lang/python/uk/LC_MESSAGES/python.mo and /tmp/tmpwCRwwi/PZJg37wy9E/calamares-3.2.2/lang/python/uk/LC_MESSAGES/python.mo differ diff -Nru calamares-3.2.1/lang/python/uk/LC_MESSAGES/python.po calamares-3.2.2/lang/python/uk/LC_MESSAGES/python.po --- calamares-3.2.1/lang/python/uk/LC_MESSAGES/python.po 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/lang/python/uk/LC_MESSAGES/python.po 2018-09-04 12:03:59.000000000 +0000 @@ -10,6 +10,7 @@ "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-06-18 07:46-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Володимир Братко , 2018\n" "Language-Team: Ukrainian (https://www.transifex.com/calamares/teams/20061/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -40,7 +41,7 @@ #: src/modules/packages/main.py:64 src/modules/packages/main.py:74 msgid "Install packages." -msgstr "" +msgstr "Встановити пакети." #: src/modules/packages/main.py:67 #, python-format diff -Nru calamares-3.2.1/settings.conf calamares-3.2.2/settings.conf --- calamares-3.2.1/settings.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/settings.conf 2018-09-04 12:03:59.000000000 +0000 @@ -102,7 +102,7 @@ - displaymanager - networkcfg - hwclock - - services + - services-systemd # - dracut - initramfs # - grubcfg diff -Nru calamares-3.2.1/src/branding/README.md calamares-3.2.2/src/branding/README.md --- calamares-3.2.1/src/branding/README.md 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/branding/README.md 2018-09-04 12:03:59.000000000 +0000 @@ -44,6 +44,15 @@ text: qsTr("This is an example text.") ``` +If you use CMake for preparing branding for packaging, the macro +`calamares_add_branding_subdirectory()`` (see also *Project Layout*, +below) will convert the source `.ts` files to their compiled form). +If you are packaging the branding by hand, use +``` + lrelease file_en.ts [file_en_GB.ts ..] +``` +with all the language suffixes to *file*. + ## Presentation The default QML classes provided by Calamares can be used for a simple @@ -105,13 +114,6 @@ to find Calamares, and then adds a subdirectory which contains the actual branding component. -Adding the subdirectory can be done as follows: - - - If the directory contains files only, and optionally has a single - subdirectory lang/ which contains the translation files for the - component, then `calamares_add_branding_subdirectory()` can be - used, which takes only the name of the subdirectory. - The file layout in a typical branding component repository is: ``` @@ -127,9 +129,19 @@ ... ``` +Adding the subdirectory can be done as follows: + + - If the directory contains files only, and optionally has a single + subdirectory lang/ which contains the translation files for the + component, then `calamares_add_branding_subdirectory()` can be + used, which takes only the name of the subdirectory. - If the branding component has many files which are organized into subdirectories, use the SUBDIRECTORIES argument to the CMake function to additionally install files from those subdirectories. For example, if the component places all of its images in an `img/` subdirectory, then call `calamares_add_branding_subdirectory( ... SUBDIRECTORIES img)`. It is a bad idea to include `lang/` in the SUBDIRECTORIES list. + - The `.ts` files from the `lang/` subdirectory need be be compiled + to `.qm` files before being installed. The CMake macro's do this + automatically. For manual packaging, use `lrelease` to compile + the files. diff -Nru calamares-3.2.1/src/calamares/CalamaresApplication.cpp calamares-3.2.2/src/calamares/CalamaresApplication.cpp --- calamares-3.2.1/src/calamares/CalamaresApplication.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/calamares/CalamaresApplication.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -133,60 +133,93 @@ } -void -CalamaresApplication::initQmlPath() +static QStringList +qmlDirCandidates( bool assumeBuilddir ) { - QDir importPath; + static const char QML[] = "qml"; + + QStringList qmlDirs; + if ( CalamaresUtils::isAppDataDirOverridden() ) + qmlDirs << CalamaresUtils::appDataDir().absoluteFilePath( QML ); + else + { + if ( assumeBuilddir ) + qmlDirs << QDir::current().absoluteFilePath( "src/qml" ); // In build-dir + qmlDirs << CalamaresUtils::appDataDir().absoluteFilePath( QML ); + } + + return qmlDirs; +} + - QString subpath( "qml" ); +static QStringList +settingsFileCandidates( bool assumeBuilddir ) +{ + static const char settings[] = "settings.conf"; + QStringList settingsPaths; if ( CalamaresUtils::isAppDataDirOverridden() ) + settingsPaths << CalamaresUtils::appDataDir().absoluteFilePath( settings ); + else { - importPath = QDir( CalamaresUtils::appDataDir() - .absoluteFilePath( subpath ) ); - if ( !importPath.exists() || !importPath.isReadable() ) - { - cError() << "FATAL: explicitly configured application data directory" - << CalamaresUtils::appDataDir().absolutePath() - << "does not contain a valid QML modules directory at" - << importPath.absolutePath() - << "\nCowardly refusing to continue startup without the QML directory."; - ::exit( EXIT_FAILURE ); - } + if ( assumeBuilddir ) + settingsPaths << QDir::current().absoluteFilePath( settings ); + settingsPaths << CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/settings.conf"; // String concat + settingsPaths << CalamaresUtils::appDataDir().absoluteFilePath( settings ); } + + return settingsPaths; +} + + +static QStringList +brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename ) +{ + QStringList brandingPaths; + if ( CalamaresUtils::isAppDataDirOverridden() ) + brandingPaths << CalamaresUtils::appDataDir().absoluteFilePath( brandingFilename ); else { - QStringList qmlDirCandidatesByPriority; - if ( isDebug() ) - { - qmlDirCandidatesByPriority.append( - QDir::current().absoluteFilePath( - QString( "src/%1" ) - .arg( subpath ) ) ); - } - qmlDirCandidatesByPriority.append( CalamaresUtils::appDataDir() - .absoluteFilePath( subpath ) ); + if ( assumeBuilddir ) + brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename ); + brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename ); + brandingPaths << CalamaresUtils::appDataDir().absoluteFilePath( brandingFilename); + } - foreach ( const QString& path, qmlDirCandidatesByPriority ) - { - QDir dir( path ); - if ( dir.exists() && dir.isReadable() ) - { - importPath = dir; - break; - } - } + return brandingPaths; +} + + +void +CalamaresApplication::initQmlPath() +{ + QDir importPath; // Right now, current-dir + QStringList qmlDirCandidatesByPriority = qmlDirCandidates( isDebug() ); + bool found = false; - if ( !importPath.exists() || !importPath.isReadable() ) + foreach ( const QString& path, qmlDirCandidatesByPriority ) + { + QDir dir( path ); + if ( dir.exists() && dir.isReadable() ) { - cError() << "FATAL: none of the expected QML paths (" - << qmlDirCandidatesByPriority.join( ", " ) - << ") exist." - << "\nCowardly refusing to continue startup without the QML directory."; - ::exit( EXIT_FAILURE ); + importPath = dir; + found = true; + break; } } + if ( !found || !importPath.exists() || !importPath.isReadable() ) + { + cError() << "Cowardly refusing to continue startup without a QML directory." + << Logger::DebugList( qmlDirCandidatesByPriority ); + if ( CalamaresUtils::isAppDataDirOverridden() ) + cError() << "FATAL: explicitly configured application data directory is missing qml/"; + else + cError() << "FATAL: none of the expected QML paths exist."; + ::exit( EXIT_FAILURE ); + } + + cDebug() << "Using Calamares QML directory" << importPath.absolutePath(); CalamaresUtils::setQmlModulesDir( importPath ); } @@ -194,51 +227,31 @@ void CalamaresApplication::initSettings() { + QStringList settingsFileCandidatesByPriority = settingsFileCandidates( isDebug() ); + QFileInfo settingsFile; - if ( CalamaresUtils::isAppDataDirOverridden() ) + bool found = false; + + foreach ( const QString& path, settingsFileCandidatesByPriority ) { - settingsFile = QFileInfo( CalamaresUtils::appDataDir().absoluteFilePath( "settings.conf" ) ); - if ( !settingsFile.exists() || !settingsFile.isReadable() ) + QFileInfo pathFi( path ); + if ( pathFi.exists() && pathFi.isReadable() ) { - cError() << "FATAL: explicitly configured application data directory" - << CalamaresUtils::appDataDir().absolutePath() - << "does not contain a valid settings.conf file." - << "\nCowardly refusing to continue startup without settings."; - ::exit( EXIT_FAILURE ); + settingsFile = pathFi; + found = true; + break; } } - else - { - QStringList settingsFileCandidatesByPriority; - if ( isDebug() ) - { - settingsFileCandidatesByPriority.append( - QDir::currentPath() + - QDir::separator() + - "settings.conf" ); - } - settingsFileCandidatesByPriority.append( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/settings.conf" ); - settingsFileCandidatesByPriority.append( CalamaresUtils::appDataDir() - .absoluteFilePath( "settings.conf" ) ); - - foreach ( const QString& path, settingsFileCandidatesByPriority ) - { - QFileInfo pathFi( path ); - if ( pathFi.exists() && pathFi.isReadable() ) - { - settingsFile = pathFi; - break; - } - } - if ( !settingsFile.exists() || !settingsFile.isReadable() ) - { - cError() << "FATAL: none of the expected configuration file paths (" - << settingsFileCandidatesByPriority.join( ", " ) - << ") contain a valid settings.conf file." - << "\nCowardly refusing to continue startup without settings."; - ::exit( EXIT_FAILURE ); - } + if ( !found || !settingsFile.exists() || !settingsFile.isReadable() ) + { + cError() << "Cowardly refusing to continue startup without settings." + << Logger::DebugList( settingsFileCandidatesByPriority ); + if ( CalamaresUtils::isAppDataDirOverridden() ) + cError() << "FATAL: explicitly configured application data directory is missing settings.conf"; + else + cError() << "FATAL: none of the expected configuration file paths exist."; + ::exit( EXIT_FAILURE ); } new Calamares::Settings( settingsFile.absoluteFilePath(), isDebug(), this ); @@ -255,59 +268,32 @@ ::exit( EXIT_FAILURE ); } - QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ) - .arg( brandingComponentName ); + QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName ); + QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath); QFileInfo brandingFile; - if ( CalamaresUtils::isAppDataDirOverridden() ) + bool found = false; + + foreach ( const QString& path, brandingFileCandidatesByPriority ) { - brandingFile = QFileInfo( CalamaresUtils::appDataDir() - .absoluteFilePath( brandingDescriptorSubpath ) ); - if ( !brandingFile.exists() || !brandingFile.isReadable() ) + QFileInfo pathFi( path ); + if ( pathFi.exists() && pathFi.isReadable() ) { - cError() << "FATAL: explicitly configured application data directory" - << CalamaresUtils::appDataDir().absolutePath() - << "does not contain a valid branding component descriptor at" - << brandingFile.absoluteFilePath() - << "\nCowardly refusing to continue startup without branding."; - ::exit( EXIT_FAILURE ); + brandingFile = pathFi; + found = true; + break; } } - else - { - QStringList brandingFileCandidatesByPriority; - if ( isDebug() ) - { - brandingFileCandidatesByPriority.append( - QDir::currentPath() + - QDir::separator() + - "src" + - QDir::separator() + - brandingDescriptorSubpath ); - } - brandingFileCandidatesByPriority.append( QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ) - .absoluteFilePath( brandingDescriptorSubpath ) ); - brandingFileCandidatesByPriority.append( CalamaresUtils::appDataDir() - .absoluteFilePath( brandingDescriptorSubpath ) ); - foreach ( const QString& path, brandingFileCandidatesByPriority ) - { - QFileInfo pathFi( path ); - if ( pathFi.exists() && pathFi.isReadable() ) - { - brandingFile = pathFi; - break; - } - } - - if ( !brandingFile.exists() || !brandingFile.isReadable() ) - { - cError() << "FATAL: none of the expected branding descriptor file paths (" - << brandingFileCandidatesByPriority.join( ", " ) - << ") contain a valid branding.desc file." - << "\nCowardly refusing to continue startup without branding."; - ::exit( EXIT_FAILURE ); - } + if ( !found || !brandingFile.exists() || !brandingFile.isReadable() ) + { + cError() << "Cowardly refusing to continue startup without branding." + << Logger::DebugList( brandingFileCandidatesByPriority ); + if ( CalamaresUtils::isAppDataDirOverridden() ) + cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName; + else + cError() << "FATAL: none of the expected branding descriptor file paths exist."; + ::exit( EXIT_FAILURE ); } new Calamares::Branding( brandingFile.absoluteFilePath(), this ); diff -Nru calamares-3.2.1/src/calamares/main.cpp calamares-3.2.2/src/calamares/main.cpp --- calamares-3.2.1/src/calamares/main.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/calamares/main.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -108,7 +108,14 @@ returnCode = a.exec(); } else + { + auto instancelist = guard.instances(); qDebug() << "Calamares is already running, shutting down."; + if ( instancelist.count() > 0 ) + qDebug() << "Other running Calamares instances:"; + for ( const auto& i : instancelist ) + qDebug() << " " << i.isValid() << i.pid() << i.arguments(); + } return returnCode; } diff -Nru calamares-3.2.1/src/libcalamares/Settings.cpp calamares-3.2.2/src/libcalamares/Settings.cpp --- calamares-3.2.1/src/libcalamares/Settings.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamares/Settings.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -212,7 +212,7 @@ } -QList< QPair< ModuleAction, QStringList > > +Settings::ModuleSequence Settings::modulesSequence() const { return m_modulesSequence; diff -Nru calamares-3.2.1/src/libcalamares/Settings.h calamares-3.2.2/src/libcalamares/Settings.h --- calamares-3.2.1/src/libcalamares/Settings.h 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamares/Settings.h 2018-09-04 12:03:59.000000000 +0000 @@ -47,7 +47,8 @@ using InstanceDescriptionList = QList< InstanceDescription >; InstanceDescriptionList customModuleInstances() const; - QList< QPair< ModuleAction, QStringList > > modulesSequence() const; + using ModuleSequence = QList< QPair< ModuleAction, QStringList > >; + ModuleSequence modulesSequence() const; QString brandingComponentName() const; @@ -63,7 +64,7 @@ QStringList m_modulesSearchPaths; InstanceDescriptionList m_customModuleInstances; - QList< QPair< ModuleAction, QStringList > > m_modulesSequence; + ModuleSequence m_modulesSequence; QString m_brandingComponentName; diff -Nru calamares-3.2.1/src/libcalamaresui/CMakeLists.txt calamares-3.2.2/src/libcalamaresui/CMakeLists.txt --- calamares-3.2.1/src/libcalamaresui/CMakeLists.txt 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamaresui/CMakeLists.txt 2018-09-04 12:03:59.000000000 +0000 @@ -48,7 +48,8 @@ if( WITH_PYTHONQT ) include_directories(${PYTHON_INCLUDE_DIRS}) - include_directories(${PYTHONQT_INCLUDE_DIR}) + # *_DIRS because we also use extensions + include_directories(${PYTHONQT_INCLUDE_DIRS}) list( APPEND calamaresui_SOURCES modulesystem/PythonQtViewModule.cpp diff -Nru calamares-3.2.1/src/libcalamaresui/modulesystem/Module.cpp calamares-3.2.2/src/libcalamaresui/modulesystem/Module.cpp --- calamares-3.2.1/src/libcalamaresui/modulesystem/Module.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamaresui/modulesystem/Module.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -44,14 +44,6 @@ #include -// Example module.desc -/* ---- -type: "view" #job or view -name: "foo" #the module name. must be unique and same as the parent directory -interface: "qtplugin" #can be: qtplugin, python, process, ... -*/ - static const char EMERGENCY[] = "emergency"; namespace Calamares @@ -144,34 +136,29 @@ } -void -Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Exception +static QStringList +moduleConfigurationCandidates( bool assumeBuildDir, const QString& moduleName, const QString& configFileName ) { - QStringList configFilesByPriority; + QStringList paths; if ( CalamaresUtils::isAppDataDirOverridden() ) - { - configFilesByPriority.append( - CalamaresUtils::appDataDir().absoluteFilePath( - QString( "modules/%1" ).arg( configFileName ) ) ); - } + paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ); else { - if ( Settings::instance()->debugMode() ) - { - configFilesByPriority.append( - QDir( QDir::currentPath() ).absoluteFilePath( - QString( "src/modules/%1/%2" ).arg( m_name ).arg( configFileName ) ) ); - } + if ( assumeBuildDir ) + paths << QDir().absoluteFilePath(QString( "src/modules/%1/%2" ).arg( moduleName ).arg( configFileName ) ); - configFilesByPriority.append( - QString( "/etc/calamares/modules/%1" ).arg( configFileName ) ); - configFilesByPriority.append( - CalamaresUtils::appDataDir().absoluteFilePath( - QString( "modules/%2" ).arg( configFileName ) ) ); + paths << QString( "/etc/calamares/modules/%1" ).arg( configFileName ); + paths << CalamaresUtils::appDataDir().absoluteFilePath( QString( "modules/%1" ).arg( configFileName ) ); } - foreach ( const QString& path, configFilesByPriority ) + return paths; +} + +void +Module::loadConfigurationFile( const QString& configFileName ) //throws YAML::Exception +{ + foreach ( const QString& path, moduleConfigurationCandidates( Settings::instance()->debugMode(), m_name, configFileName ) ) { QFile configFile( path ); if ( configFile.exists() && configFile.open( QFile::ReadOnly | QFile::Text ) ) @@ -224,13 +211,6 @@ } -QStringList -Module::requiredModules() const -{ - return m_requiredModules; -} - - QString Module::location() const { @@ -286,7 +266,6 @@ Module::initFrom( const QVariantMap& moduleDescriptor ) { m_name = moduleDescriptor.value( "name" ).toString(); - if ( moduleDescriptor.contains( EMERGENCY ) ) m_maybe_emergency = moduleDescriptor[ EMERGENCY ].toBool(); } diff -Nru calamares-3.2.1/src/libcalamaresui/modulesystem/Module.h calamares-3.2.2/src/libcalamaresui/modulesystem/Module.h --- calamares-3.2.1/src/libcalamaresui/modulesystem/Module.h 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamaresui/modulesystem/Module.h 2018-09-04 12:03:59.000000000 +0000 @@ -107,13 +107,6 @@ virtual QString instanceKey() const final; /** - * @brief requiredModules a list of names of modules required by this one. - * @return the list of names. - * The module dependencies system is currently incomplete and unused. - */ - virtual QStringList requiredModules() const; - - /** * @brief location returns the full path of this module's directory. * @return the path. */ @@ -198,7 +191,6 @@ void loadConfigurationFile( const QString& configFileName ); //throws YAML::Exception QString m_name; - QStringList m_requiredModules; QString m_directory; QString m_instanceId; diff -Nru calamares-3.2.1/src/libcalamaresui/modulesystem/ModuleManager.cpp calamares-3.2.2/src/libcalamaresui/modulesystem/ModuleManager.cpp --- calamares-3.2.1/src/libcalamaresui/modulesystem/ModuleManager.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamaresui/modulesystem/ModuleManager.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -126,7 +126,6 @@ } // At this point m_availableModules is filled with whatever was found in the // search paths. - checkDependencies(); emit initDone(); } @@ -176,11 +175,11 @@ { QTimer::singleShot( 0, this, [ this ]() { - QStringList failedModules; + QStringList failedModules = checkDependencies(); Settings::InstanceDescriptionList customInstances = Settings::instance()->customModuleInstances(); - const auto modulesSequence = Settings::instance()->modulesSequence(); + const auto modulesSequence = failedModules.isEmpty() ? Settings::instance()->modulesSequence() : Settings::ModuleSequence(); for ( const auto& modulePhase : modulesSequence ) { ModuleAction currentAction = modulePhase.first; @@ -262,6 +261,14 @@ failedModules.append( instanceKey ); continue; } + + if ( !checkDependencies( *thisModule ) ) + { + // Error message is already printed + failedModules.append( instanceKey ); + continue; + } + // If it's a ViewModule, it also appends the ViewStep to the ViewManager. thisModule->loadSelf(); m_loadedModulesByInstanceKey.insert( instanceKey, thisModule ); @@ -301,24 +308,29 @@ } -void +QStringList ModuleManager::checkDependencies() { + QStringList failed; + // This goes through the map of available modules, and deletes those whose // dependencies are not met, if any. - bool somethingWasRemovedBecauseOfUnmetDependencies = false; forever { + bool somethingWasRemovedBecauseOfUnmetDependencies = false; for ( auto it = m_availableDescriptorsByModuleName.begin(); it != m_availableDescriptorsByModuleName.end(); ++it ) { foreach ( const QString& depName, - ( *it ).value( "requiredModules" ).toStringList() ) + it->value( "requiredModules" ).toStringList() ) { if ( !m_availableDescriptorsByModuleName.contains( depName ) ) { + QString moduleName = it->value( "name" ).toString(); somethingWasRemovedBecauseOfUnmetDependencies = true; m_availableDescriptorsByModuleName.erase( it ); + failed << moduleName; + cWarning() << "Module" << moduleName << "has unknown requirement" << depName; break; } } @@ -328,7 +340,33 @@ if ( !somethingWasRemovedBecauseOfUnmetDependencies ) break; } + + return failed; } +bool +ModuleManager::checkDependencies( const Module& m ) +{ + bool allRequirementsFound = true; + QStringList requiredModules = m_availableDescriptorsByModuleName[ m.name() ].value( "requiredModules" ).toStringList(); + + for ( const QString& required : requiredModules ) + { + bool requirementFound = false; + for( const Module* v : m_loadedModulesByInstanceKey ) + if ( required == v->name() ) + { + requirementFound = true; + break; + } + if ( !requirementFound ) + { + cError() << "Module" << m.name() << "requires" << required << "before it in sequence."; + allRequirementsFound = false; + } + } + + return allRequirementsFound; +} } diff -Nru calamares-3.2.1/src/libcalamaresui/modulesystem/ModuleManager.h calamares-3.2.2/src/libcalamaresui/modulesystem/ModuleManager.h --- calamares-3.2.1/src/libcalamaresui/modulesystem/ModuleManager.h 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamaresui/modulesystem/ModuleManager.h 2018-09-04 12:03:59.000000000 +0000 @@ -90,7 +90,25 @@ void doInit(); private: - void checkDependencies(); + /** + * Check in a general sense whether the dependencies between + * modules are valid. Returns a list of module names that + * do **not** have their requirements met. + * + * Returns an empty list on success. + * + * Also modifies m_availableDescriptorsByModuleName to remove + * all the entries that fail. + */ + QStringList checkDependencies(); + + /** + * Check for this specific module if its required modules have + * already been loaded (i.e. are in sequence before it). + * + * Returns true if the requirements are met. + */ + bool checkDependencies( const Module& ); QMap< QString, QVariantMap > m_availableDescriptorsByModuleName; QMap< QString, QString > m_moduleDirectoriesByModuleName; diff -Nru calamares-3.2.1/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp calamares-3.2.2/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp --- calamares-3.2.1/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/libcalamaresui/modulesystem/PythonQtViewModule.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -31,7 +31,7 @@ #include "JobQueue.h" #include -#include +#include #include #include diff -Nru calamares-3.2.1/src/modules/bootloader/bootloader.conf calamares-3.2.2/src/modules/bootloader/bootloader.conf --- calamares-3.2.1/src/modules/bootloader/bootloader.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/bootloader/bootloader.conf 2018-09-04 12:03:59.000000000 +0000 @@ -12,8 +12,10 @@ img: "/initramfs-linux.img" fallback: "/initramfs-linux-fallback.img" timeout: "10" + # Optionally set the menu entry name and kernel name to use in systemd-boot. # If not specified here, these settings will be taken from branding.desc. +# # bootloaderEntryName: "Generic GNU/Linux" # kernelLine: ", with Stable-Kernel" # fallbackKernelLine: ", with Stable-Kernel (fallback initramfs)" diff -Nru calamares-3.2.1/src/modules/CMakeLists.txt calamares-3.2.2/src/modules/CMakeLists.txt --- calamares-3.2.1/src/modules/CMakeLists.txt 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/CMakeLists.txt 2018-09-04 12:03:59.000000000 +0000 @@ -15,13 +15,34 @@ file( GLOB SUBDIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) list( SORT SUBDIRECTORIES ) +set( _use_categories "" ) +set( _found_categories "" ) + foreach( SUBDIRECTORY ${SUBDIRECTORIES} ) list( FIND SKIP_LIST ${SUBDIRECTORY} DO_SKIP ) + set( _skip_reason "user request" ) + # Handle the USE_ variables by looking for subdirectories + # with a - kind of name. + if( SUBDIRECTORY MATCHES "^[a-zA-Z0-9_]+-" ) + string( REGEX REPLACE "^[^-]+-" "" _implementation ${SUBDIRECTORY} ) + string( REGEX REPLACE "-.*" "" _category ${SUBDIRECTORY} ) + if( USE_${_category} ) + list( APPEND _use_categories ${_category} ) + if( "${_implementation}" STREQUAL "${USE_${_category}}" ) + list( APPEND _found_categories ${_category} ) + else() + list( APPEND SKIP_LIST ${SUBDIRECTORY} ) + set( _skip_reason "USE_${_category}=${USE_${_category}}" ) + set( DO_SKIP 1 ) + endif() + endif() + endif() + if( NOT DO_SKIP EQUAL -1 ) message( "${ColorReset}-- Skipping module ${BoldRed}${SUBDIRECTORY}${ColorReset}." ) message( "" ) - list( APPEND LIST_SKIPPED_MODULES "${SUBDIRECTORY} (user request)" ) + list( APPEND LIST_SKIPPED_MODULES "${SUBDIRECTORY} (${_skip_reason})" ) elseif( ( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}" ) AND ( DO_SKIP EQUAL -1 ) ) set( SKIPPED_MODULES ) @@ -36,5 +57,12 @@ # both before and after the feature summary. calamares_explain_skipped_modules( ${LIST_SKIPPED_MODULES} ) +foreach( _category ${_use_categories} ) + list( FIND _found_categories ${_category} _found ) + if ( _found EQUAL -1 ) + message( FATAL_ERROR "USE_${_category} is set to ${USE_${_category}} and no module matches." ) + endif() +endforeach() + include( CalamaresAddTranslations ) add_calamares_python_translations( ${CALAMARES_TRANSLATION_LANGUAGES} ) diff -Nru calamares-3.2.1/src/modules/displaymanager/displaymanager.conf calamares-3.2.2/src/modules/displaymanager/displaymanager.conf --- calamares-3.2.1/src/modules/displaymanager/displaymanager.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/displaymanager/displaymanager.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,3 +1,5 @@ +# Configure one or more display managers (e.g. SDDM) +# with a "best effort" approach. --- #The DM module attempts to set up all the DMs found in this list, in that precise order. #It also sets up autologin, if the feature is enabled in globalstorage. diff -Nru calamares-3.2.1/src/modules/displaymanager/main.py calamares-3.2.2/src/modules/displaymanager/main.py --- calamares-3.2.1/src/modules/displaymanager/main.py 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/displaymanager/main.py 2018-09-04 12:03:59.000000000 +0000 @@ -3,7 +3,7 @@ # # === This file is part of Calamares - === # -# Copyright 2014-2017, Philip Müller +# Copyright 2014-2018, Philip Müller # Copyright 2014-2015, Teo Mrnjavac # Copyright 2014, Kevin Kofler # Copyright 2017, Alf Gaida @@ -23,20 +23,53 @@ # You should have received a copy of the GNU General Public License # along with Calamares. If not, see . +import abc import os -import collections import re import libcalamares import configparser +from libcalamares.utils import gettext_path, gettext_languages + +import gettext +_translation = gettext.translation("calamares-python", + localedir=gettext_path(), + languages=gettext_languages(), + fallback=True) +_ = _translation.gettext +_n = _translation.ngettext + +class DesktopEnvironment: + """ + Desktop Environment -- some utility functions for a desktop + environment (e.g. finding out if it is installed). This + is independent of the *Display Manager*, which is what + we're configuring in this module. + """ + def __init__(self, exec, desktop): + self.executable = exec + self.desktop_file = desktop + + def find_desktop_environment(self, root_mount_point): + """ + Check if this environment is installed in the + target system at @p root_mount_point. + """ + return ( + os.path.exists("{!s}{!s}".format(root_mount_point, self.executable)) and + os.path.exists("{!s}/usr/share/xsessions/{!s}.desktop".format(root_mount_point, self.desktop_file)) + ) -DesktopEnvironment = collections.namedtuple( - 'DesktopEnvironment', ['executable', 'desktop_file'] - ) desktop_environments = [ DesktopEnvironment('/usr/bin/startkde', 'plasma'), # KDE Plasma 5 DesktopEnvironment('/usr/bin/startkde', 'kde-plasma'), # KDE Plasma 4 + DesktopEnvironment( + '/usr/bin/budgie-desktop', 'budgie-desktop' # Budgie v10 + ), + DesktopEnvironment( + '/usr/bin/budgie-session', 'budgie-desktop' # Budgie v8 + ), DesktopEnvironment('/usr/bin/gnome-session', 'gnome'), DesktopEnvironment('/usr/bin/startxfce4', 'xfce'), DesktopEnvironment('/usr/bin/cinnamon-session-cinnamon', 'cinnamon'), @@ -47,8 +80,6 @@ DesktopEnvironment('/usr/bin/lxqt-session', 'lxqt'), DesktopEnvironment('/usr/bin/pekwm', 'pekwm'), DesktopEnvironment('/usr/bin/pantheon-session', 'pantheon'), - DesktopEnvironment('/usr/bin/budgie-session', 'budgie-session'), - DesktopEnvironment('/usr/bin/budgie-desktop', 'budgie-desktop'), DesktopEnvironment('/usr/bin/i3', 'i3'), DesktopEnvironment('/usr/bin/startdde', 'deepin'), DesktopEnvironment('/usr/bin/openbox-session', 'openbox') @@ -63,54 +94,80 @@ :return: """ for desktop_environment in desktop_environments: - if (os.path.exists("{!s}{!s}".format( - root_mount_point, desktop_environment.executable - ) - ) and os.path.exists( - "{!s}/usr/share/xsessions/{!s}.desktop".format( - root_mount_point, desktop_environment.desktop_file - ) - )): + if desktop_environment.find_desktop_environment(root_mount_point): return desktop_environment return None -def have_dm(dm_name, root_mount_point): +class DisplayManager(metaclass=abc.ABCMeta): """ - Checks if display manager is properly installed. - - :param dm_name: - :param root_mount_point: - :return: + Display Manager -- a base class for DM configuration. """ - bin_path = "{!s}/usr/bin/{!s}".format(root_mount_point, dm_name) - sbin_path = "{!s}/usr/sbin/{!s}".format(root_mount_point, dm_name) - return (os.path.exists(bin_path) - or os.path.exists(sbin_path) - ) + name = None + executable = None + def __init__(self, root_mount_point): + self.root_mount_point = root_mount_point -def set_autologin(username, - displaymanager, - default_desktop_environment, - root_mount_point): - """ - Enables automatic login for the installed desktop managers. + def have_dm(self): + """ + Is this DM installed in the target system? + The default implementation checks for `executable` + in the target system. + """ + if self.executable is None: + return True - :param username: - :param displaymanager: str - The displaymanager for which to configure autologin. - :param default_desktop_environment: - :param root_mount_point: - """ - do_autologin = True + bin_path = "{!s}/usr/bin/{!s}".format(self.root_mount_point, self.executable) + sbin_path = "{!s}/usr/sbin/{!s}".format(self.root_mount_point, self.executable) + return ( + os.path.exists(bin_path) + or os.path.exists(sbin_path) + ) - if username is None: - do_autologin = False + # The four abstract methods below are called in the order listed here. + # They must all be implemented by subclasses, but not all of them + # actually do something for all DMs. + + @abc.abstractmethod + def basic_setup(self): + """ + Do basic setup (e.g. users, groups, directory creation) for this DM. + """ + # Some implementations do nothing + + @abc.abstractmethod + def desktop_environment_setup(self, desktop_environment): + """ + Configure the given @p desktop_environment as the default one, in + the configuration files for this DM. + """ + # Many implementations do nothing + + @abc.abstractmethod + def greeter_setup(self): + """ + Additional setup for the greeter. + """ + # Most implementations do nothing + + @abc.abstractmethod + def set_autologin(self, username, do_autologin, default_desktop_environment): + """ + Configure the DM inside the given @p root_mount_point with + autologin (if @p do_autologin is True) for the given @p username. + If the DM supports it, set the default DE to @p default_desktop_environment + as well. + """ + + +class DMmdm(DisplayManager): + name = "mdm" + executable = "mdm" - if "mdm" == displaymanager: + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with MDM as Desktop Manager - mdm_conf_path = os.path.join(root_mount_point, "etc/mdm/custom.conf") + mdm_conf_path = os.path.join(self.root_mount_point, "etc/mdm/custom.conf") if os.path.exists(mdm_conf_path): with open(mdm_conf_path, 'r') as mdm_conf: @@ -145,9 +202,58 @@ else: mdm_conf.write('AutomaticLoginEnable=False\n') - if "gdm" == displaymanager: + def basic_setup(self): + if libcalamares.utils.target_env_call( + ['getent', 'group', 'mdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['groupadd', '-g', '128', 'mdm'] + ) + + if libcalamares.utils.target_env_call( + ['getent', 'passwd', 'mdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['useradd', + '-c', '"Linux Mint Display Manager"', + '-u', '128', + '-g', 'mdm', + '-d', '/var/lib/mdm', + '-s', '/usr/bin/nologin', + 'mdm' + ] + ) + + libcalamares.utils.target_env_call( + ['passwd', '-l', 'mdm'] + ) + libcalamares.utils.target_env_call( + ['chown', 'root:mdm', '/var/lib/mdm'] + ) + libcalamares.utils.target_env_call( + ['chmod', '1770', '/var/lib/mdm'] + ) + + def desktop_environment_setup(self, default_desktop_environment): + os.system( + "sed -i \"s|default.desktop|{!s}.desktop|g\" " + "{!s}/etc/mdm/custom.conf".format( + default_desktop_environment.desktop_file, + self.root_mount_point + ) + ) + + def greeter_setup(self): + pass + + +class DMgdm(DisplayManager): + name = "gdm" + executable = "gdm" + + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with GDM as Desktop Manager - gdm_conf_path = os.path.join(root_mount_point, "etc/gdm/custom.conf") + gdm_conf_path = os.path.join(self.root_mount_point, "etc/gdm/custom.conf") if os.path.exists(gdm_conf_path): with open(gdm_conf_path, 'r') as gdm_conf: @@ -181,7 +287,7 @@ if (do_autologin): accountservice_dir = "{!s}/var/lib/AccountsService/users".format( - root_mount_point + self.root_mount_point ) userfile_path = "{!s}/{!s}".format(accountservice_dir, username) if os.path.exists(accountservice_dir): @@ -194,10 +300,51 @@ userfile.write("Icon=\n") - if "kdm" == displaymanager: + + def basic_setup(self): + if libcalamares.utils.target_env_call( + ['getent', 'group', 'gdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['groupadd', '-g', '120', 'gdm'] + ) + + if libcalamares.utils.target_env_call( + ['getent', 'passwd', 'gdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['useradd', + '-c', '"Gnome Display Manager"', + '-u', '120', + '-g', 'gdm', + '-d', '/var/lib/gdm', + '-s', '/usr/bin/nologin', + 'gdm' + ] + ) + + libcalamares.utils.target_env_call( + ['passwd', '-l', 'gdm'] + ) + libcalamares.utils.target_env_call( + ['chown', '-R', 'gdm:gdm', '/var/lib/gdm'] + ) + + def desktop_environment_setup(self, desktop_environment): + pass + + def greeter_setup(self): + pass + + +class DMkdm(DisplayManager): + name = "kdm" + executable = "kdm" + + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with KDM as Desktop Manager kdm_conf_path = os.path.join( - root_mount_point, "usr/share/config/kdm/kdmrc" + self.root_mount_point, "usr/share/config/kdm/kdmrc" ) # Check which path is in use: SUSE does something else. # Also double-check the default setting. Pick the first @@ -206,7 +353,7 @@ "usr/share/config/kdm/kdmrc", "usr/share/kde4/config/kdm/kdmrc", ): - p = os.path.join(root_mount_point, candidate_kdmrc) + p = os.path.join(self.root_mount_point, candidate_kdmrc) if os.path.exists(p): kdm_conf_path = p break @@ -230,13 +377,51 @@ kdm_conf.write(line) else: return ( - "Cannot write KDM configuration file", - "KDM config file {!s} does not exist".format(kdm_conf_path) + _("Cannot write KDM configuration file"), + _("KDM config file {!s} does not exist").format(kdm_conf_path) ) - if "lxdm" == displaymanager: + def basic_setup(self): + if libcalamares.utils.target_env_call( + ['getent', 'group', 'kdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['groupadd', '-g', '135', 'kdm'] + ) + + if libcalamares.utils.target_env_call( + ['getent', 'passwd', 'kdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['useradd', + '-u', '135', + '-g', 'kdm', + '-d', '/var/lib/kdm', + '-s', '/bin/false', + '-r', + '-M', + 'kdm' + ] + ) + + libcalamares.utils.target_env_call( + ['chown', '-R', '135:135', 'var/lib/kdm'] + ) + + def desktop_environment_setup(self, desktop_environment): + pass + + def greeter_setup(self): + pass + + +class DMlxdm(DisplayManager): + name = "lxdm" + executable = "lxdm" + + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with LXDM as Desktop Manager - lxdm_conf_path = os.path.join(root_mount_point, "etc/lxdm/lxdm.conf") + lxdm_conf_path = os.path.join(self.root_mount_point, "etc/lxdm/lxdm.conf") text = [] if os.path.exists(lxdm_conf_path): @@ -254,17 +439,52 @@ lxdm_conf.write(line) else: return ( - "Cannot write LXDM configuration file", - "LXDM config file {!s} does not exist".format(lxdm_conf_path) + _("Cannot write LXDM configuration file"), + _("LXDM config file {!s} does not exist").format(lxdm_conf_path) + ) + + def basic_setup(self): + if libcalamares.utils.target_env_call( + ['getent', 'group', 'lxdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['groupadd', '--system', 'lxdm'] ) - if "lightdm" == displaymanager: + libcalamares.utils.target_env_call( + ['chgrp', '-R', 'lxdm', '/var/lib/lxdm'] + ) + libcalamares.utils.target_env_call( + ['chgrp', 'lxdm', '/etc/lxdm/lxdm.conf'] + ) + libcalamares.utils.target_env_call( + ['chmod', '+r', '/etc/lxdm/lxdm.conf'] + ) + + def desktop_environment_setup(self, default_desktop_environment): + os.system( + "sed -i -e \"s|^.*session=.*|session={!s}|\" " + "{!s}/etc/lxdm/lxdm.conf".format( + default_desktop_environment.executable, + self.root_mount_point + ) + ) + + def greeter_setup(self): + pass + + +class DMlightdm(DisplayManager): + name = "lightdm" + executable = "lightdm" + + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with LightDM as Desktop Manager # Ideally, we should use configparser for the ini conf file, # but we just do a simple text replacement for now, as it # worksforme(tm) lightdm_conf_path = os.path.join( - root_mount_point, "etc/lightdm/lightdm.conf" + self.root_mount_point, "etc/lightdm/lightdm.conf" ) text = [] @@ -294,15 +514,93 @@ "#autologin-user=\n") except FileNotFoundError: return ( - "Cannot write LightDM configuration file", - "LightDM config file {!s} does not exist".format( - lightdm_conf_path + _("Cannot write LightDM configuration file"), + _("LightDM config file {!s} does not exist").format(lightdm_conf_path) + ) + + + def basic_setup(self): + libcalamares.utils.target_env_call( + ['mkdir', '-p', '/run/lightdm'] + ) + + if libcalamares.utils.target_env_call( + ['getent', 'group', 'lightdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['groupadd', '-g', '620', 'lightdm'] + ) + + if libcalamares.utils.target_env_call( + ['getent', 'passwd', 'lightdm'] + ) != 0: + libcalamares.utils.target_env_call( + ['useradd', '-c', + '"LightDM Display Manager"', + '-u', '620', + '-g', 'lightdm', + '-d', '/var/run/lightdm', + '-s', '/usr/bin/nologin', + 'lightdm' + ] + ) + + libcalamares.utils.target_env_call(['passwd', '-l', 'lightdm']) + libcalamares.utils.target_env_call(['chown', '-R', 'lightdm:lightdm', '/run/lightdm']) + libcalamares.utils.target_env_call(['chmod', '+r' '/etc/lightdm/lightdm.conf']) + + def desktop_environment_setup(self, default_desktop_environment): + os.system( + "sed -i -e \"s/^.*user-session=.*/user-session={!s}/\" " + "{!s}/etc/lightdm/lightdm.conf".format( + default_desktop_environment.desktop_file, + self.root_mount_point + ) + ) + + def greeter_setup(self): + lightdm_conf_path = os.path.join( + self.root_mount_point, "etc/lightdm/lightdm.conf" + ) + + # configure lightdm-greeter + greeter_path = os.path.join( + self.root_mount_point, "usr/share/xgreeters" + ) + + if (os.path.exists(greeter_path)): + # configure first found lightdm-greeter + for entry in os.listdir(greeter_path): + if entry.endswith('.desktop'): + greeter = entry.split('.')[0] + libcalamares.utils.debug( + "found greeter {!s}".format(greeter) + ) + os.system( + "sed -i -e \"s/^.*greeter-session=.*" + "/greeter-session={!s}/\" {!s}".format( + greeter, + lightdm_conf_path + ) + ) + libcalamares.utils.debug( + "{!s} configured as greeter.".format(greeter) ) + break + else: + return ( + _("Cannot configure LightDM"), + _("No LightDM greeter installed.") ) - if "slim" == displaymanager: + +class DMslim(DisplayManager): + name = "slim" + executable = "slim" + + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with Slim as Desktop Manager - slim_conf_path = os.path.join(root_mount_point, "etc/slim.conf") + slim_conf_path = os.path.join(self.root_mount_point, "etc/slim.conf") text = [] if os.path.exists(slim_conf_path): @@ -323,13 +621,28 @@ slim_conf.write(line) else: return ( - "Cannot write SLIM configuration file", - "SLIM config file {!s} does not exist".format(slim_conf_path) + _("Cannot write SLIM configuration file"), + _("SLIM config file {!s} does not exist").format(slim_conf_path) ) - if "sddm" == displaymanager: + + def basic_setup(self): + pass + + def desktop_environment_setup(self, desktop_environment): + pass + + def greeter_setup(self): + pass + + +class DMsddm(DisplayManager): + name = "sddm" + executable = "sddm" + + def set_autologin(self, username, do_autologin, default_desktop_environment): # Systems with Sddm as Desktop Manager - sddm_conf_path = os.path.join(root_mount_point, "etc/sddm.conf") + sddm_conf_path = os.path.join(self.root_mount_point, "etc/sddm.conf") sddm_config = configparser.ConfigParser(strict=False) # Make everything case sensitive @@ -356,7 +669,22 @@ with open(sddm_conf_path, 'w') as sddm_config_file: sddm_config.write(sddm_config_file, space_around_delimiters=False) - if "sysconfig" == displaymanager: + + def basic_setup(self): + pass + + def desktop_environment_setup(self, desktop_environment): + pass + + def greeter_setup(self): + pass + + +class DMsysconfig(DisplayManager): + name = "sysconfig" + executable = None + + def set_autologin(self, username, do_autologin, default_desktop_environment): dmauto = "DISPLAYMANAGER_AUTOLOGIN" os.system( @@ -364,11 +692,28 @@ "{!s}/etc/sysconfig/displaymanager".format( dmauto, dmauto, username if do_autologin else "", - root_mount_point + self.root_mount_point ) ) - return None + + def basic_setup(self): + pass + + def desktop_environment_setup(self, desktop_environment): + pass + + def greeter_setup(self): + pass + + +# Collect all the subclasses of DisplayManager defined above, +# and index them based on the name property of each class. +display_managers = [ + (c.name, c) + for c in globals().values() + if type(c) is abc.ABCMeta and issubclass(c, DisplayManager) and c.name +] def run(): @@ -382,23 +727,55 @@ If a displaymanager is in the list but not installed, a debugging message is printed and the entry ignored. """ + # Get configuration settings for display managers + displaymanagers = None if "displaymanagers" in libcalamares.job.configuration: displaymanagers = libcalamares.job.configuration["displaymanagers"] if libcalamares.globalstorage.contains("displayManagers"): displaymanagers = libcalamares.globalstorage.value("displayManagers") - if displaymanagers is None: + if not displaymanagers: return ( - "No display managers selected for the displaymanager module.", - "The displaymanagers list is empty or undefined in both" - "globalstorage and displaymanager.conf." + _("No display managers selected for the displaymanager module."), + _("The displaymanagers list is empty or undefined in both" + "globalstorage and displaymanager.conf.") ) - username = libcalamares.globalstorage.value("autologinUser") + # Get instances that are actually installed root_mount_point = libcalamares.globalstorage.value("rootMountPoint") + dm_impl = [] + dm_names = displaymanagers[:] + if ("sysconfigSetup" in libcalamares.job.configuration + and libcalamares.job.configuration["sysconfigSetup"]): + dm_names.append("sysconfig") + for dm in dm_names: + # Find the implementation class + dm_instance = None + impl = [ cls for name, cls in display_managers if name == dm ] + if len(impl) == 1: + dm_instance = impl[0](root_mount_point) + if dm_instance.have_dm(): + dm_impl.append(dm_instance) + else: + dm_instance = None + else: + libcalamares.utils.debug("{!s} has {!d} implementation classes.".format(dm).format(len(impl))) + + if dm_instance is None: + libcalamares.utils.debug("{!s} selected but not installed".format(dm)) + if dm in displaymanagers: + displaymanagers.remove(dm) - if "default_desktop_environment" in libcalamares.job.configuration: + if not dm_impl: + return ( + _("No display managers selected for the displaymanager module."), + _("The list is empty after checking for installed display managers.") + ) + + + # Pick up remaining settings + if "defaultDesktopEnvironment" in libcalamares.job.configuration: entry = libcalamares.job.configuration["defaultDesktopEnvironment"] default_desktop_environment = DesktopEnvironment( entry["executable"], entry["desktopFile"] @@ -413,269 +790,34 @@ else: enable_basic_setup = False - # Setup slim - if "slim" in displaymanagers: - if not have_dm("slim", root_mount_point): - libcalamares.utils.debug("slim selected but not installed") - displaymanagers.remove("slim") - - # Setup sddm - if "sddm" in displaymanagers: - if not have_dm("sddm", root_mount_point): - libcalamares.utils.debug("sddm selected but not installed") - displaymanagers.remove("sddm") - - # setup lightdm - if "lightdm" in displaymanagers: - if have_dm("lightdm", root_mount_point): - lightdm_conf_path = os.path.join( - root_mount_point, "etc/lightdm/lightdm.conf" - ) - - if enable_basic_setup: - libcalamares.utils.target_env_call( - ['mkdir', '-p', '/run/lightdm'] - ) - - if libcalamares.utils.target_env_call( - ['getent', 'group', 'lightdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['groupadd', '-g', '620', 'lightdm'] - ) - - if libcalamares.utils.target_env_call( - ['getent', 'passwd', 'lightdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['useradd', '-c', - '"LightDM Display Manager"', - '-u', '620', - '-g', 'lightdm', - '-d', '/var/run/lightdm', - '-s', '/usr/bin/nologin', - 'lightdm' - ] - ) - - libcalamares.utils.target_env_call('passwd', '-l', 'lightdm') - libcalamares.utils.target_env_call( - ['chown', '-R', 'lightdm:lightdm', '/run/lightdm'] - ) - libcalamares.utils.target_env_call( - ['chmod', '+r' '/etc/lightdm/lightdm.conf'] - ) - - if default_desktop_environment is not None: - os.system( - "sed -i -e \"s/^.*user-session=.*/user-session={!s}/\" " - "{!s}".format( - default_desktop_environment.desktop_file, - lightdm_conf_path - ) - ) - - # configure lightdm-greeter - greeter_path = os.path.join( - root_mount_point, "usr/share/xgreeters" - ) - - if (os.path.exists(greeter_path)): - # configure first found lightdm-greeter - for entry in os.listdir(greeter_path): - if entry.endswith('.desktop'): - greeter = entry.split('.')[0] - libcalamares.utils.debug( - "found greeter {!s}".format(greeter) - ) - os.system( - "sed -i -e \"s/^.*greeter-session=.*" - "/greeter-session={!s}/\" {!s}".format( - greeter, - lightdm_conf_path - ) - ) - libcalamares.utils.debug( - "{!s} configured as greeter.".format(greeter) - ) - break - else: - return ("No lightdm greeter installed.") - else: - libcalamares.utils.debug("lightdm selected but not installed") - displaymanagers.remove("lightdm") - - # Setup gdm - if "gdm" in displaymanagers: - if have_dm("gdm", root_mount_point): - if enable_basic_setup: - if libcalamares.utils.target_env_call( - ['getent', 'group', 'gdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['groupadd', '-g', '120', 'gdm'] - ) - - if libcalamares.utils.target_env_call( - ['getent', 'passwd', 'gdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['useradd', - '-c', '"Gnome Display Manager"', - '-u', '120', - '-g', 'gdm', - '-d', '/var/lib/gdm', - '-s', '/usr/bin/nologin', - 'gdm' - ] - ) - - libcalamares.utils.target_env_call( - ['passwd', '-l', 'gdm'] - ) - libcalamares.utils.target_env_call( - ['chown', '-R', 'gdm:gdm', '/var/lib/gdm'] - ) - else: - libcalamares.utils.debug("gdm selected but not installed") - displaymanagers.remove("gdm") - - # Setup mdm - if "mdm" in displaymanagers: - if have_dm("mdm", root_mount_point): - if enable_basic_setup: - if libcalamares.utils.target_env_call( - ['getent', 'group', 'mdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['groupadd', '-g', '128', 'mdm'] - ) - - if libcalamares.utils.target_env_call( - ['getent', 'passwd', 'mdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['useradd', - '-c', '"Linux Mint Display Manager"', - '-u', '128', - '-g', 'mdm', - '-d', '/var/lib/mdm', - '-s', '/usr/bin/nologin', - 'mdm' - ] - ) - - libcalamares.utils.target_env_call( - ['passwd', '-l', 'mdm'] - ) - libcalamares.utils.target_env_call( - ['chown', 'root:mdm', '/var/lib/mdm'] - ) - libcalamares.utils.target_env_call( - ['chmod', '1770', '/var/lib/mdm'] - ) - - if default_desktop_environment is not None: - os.system( - "sed -i \"s|default.desktop|{!s}.desktop|g\" " - "{!s}/etc/mdm/custom.conf".format( - default_desktop_environment.desktop_file, - root_mount_point - ) - ) - else: - libcalamares.utils.debug("mdm selected but not installed") - displaymanagers.remove("mdm") - - # Setup lxdm - if "lxdm" in displaymanagers: - if have_dm("lxdm", root_mount_point): - if enable_basic_setup: - if libcalamares.utils.target_env_call( - ['getent', 'group', 'lxdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['groupadd', '--system', 'lxdm'] - ) - - libcalamares.utils.target_env_call( - ['chgrp', '-R', 'lxdm', '/var/lib/lxdm'] - ) - libcalamares.utils.target_env_call( - ['chgrp', 'lxdm', '/etc/lxdm/lxdm.conf'] - ) - libcalamares.utils.target_env_call( - ['chmod', '+r', '/etc/lxdm/lxdm.conf'] - ) - - if default_desktop_environment is not None: - os.system( - "sed -i -e \"s|^.*session=.*|session={!s}|\" " - "{!s}/etc/lxdm/lxdm.conf".format( - default_desktop_environment.executable, - root_mount_point - ) - ) - else: - libcalamares.utils.debug("lxdm selected but not installed") - displaymanagers.remove("lxdm") - - # Setup kdm - if "kdm" in displaymanagers: - if have_dm("kdm", root_mount_point): - if enable_basic_setup: - if libcalamares.utils.target_env_call( - ['getent', 'group', 'kdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['groupadd', '-g', '135', 'kdm'] - ) - - if libcalamares.utils.target_env_call( - ['getent', 'passwd', 'kdm'] - ) != 0: - libcalamares.utils.target_env_call( - ['useradd', - '-u', '135', - '-g', 'kdm', - '-d', '/var/lib/kdm', - '-s', '/bin/false', - '-r', - '-M', - 'kdm' - ] - ) - - libcalamares.utils.target_env_call( - ['chown', '-R', '135:135', 'var/lib/kdm'] - ) - else: - libcalamares.utils.debug("kdm selected but not installed") - displaymanagers.remove("kdm") - + username = libcalamares.globalstorage.value("autologinUser") if username is not None: - libcalamares.utils.debug( - "Setting up autologin for user {!s}.".format(username) - ) + do_autologin = True + libcalamares.utils.debug("Setting up autologin for user {!s}.".format(username)) else: + do_autologin = False libcalamares.utils.debug("Unsetting autologin.") libcalamares.globalstorage.insert("displayManagers", displaymanagers) + # Do the actual configuration and collect messages dm_setup_message = [] - for dm in displaymanagers: - dm_message = set_autologin( - username, dm, - default_desktop_environment, - root_mount_point - ) + for dm in dm_impl: + dm_message = None + if enable_basic_setup: + dm_message = dm.basic_setup() + if default_desktop_environment is not None and dm_message is None: + dm_message = dm.desktop_environment_setup(default_desktop_environment) + if dm_message is None: + dm_message = dm.greeter_setup() + if dm_message is None: + dm_message = dm.set_autologin(username, do_autologin, default_desktop_environment) + if dm_message is not None: dm_setup_message.append("{!s}: {!s}".format(*dm_message)) - if ("sysconfigSetup" in libcalamares.job.configuration - and libcalamares.job.configuration["sysconfigSetup"]): - set_autologin(username, "sysconfig", None, root_mount_point) - if dm_setup_message: - return ("Display manager configuration was incomplete", - "\n".join(dm_setup_message)) + return ( + _("Display manager configuration was incomplete"), + "\n".join(dm_setup_message) + ) diff -Nru calamares-3.2.1/src/modules/dummycpp/dummycpp.conf calamares-3.2.2/src/modules/dummycpp/dummycpp.conf --- calamares-3.2.1/src/modules/dummycpp/dummycpp.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/dummycpp/dummycpp.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,3 +1,6 @@ +# This is a dummy (example) module for C++ Jobs. +# +# The code is the documentation for the configuration file. --- syntax: "YAML map of anything" example: @@ -15,4 +18,4 @@ - "another element" - name: "another item" contents: - - "not much" \ No newline at end of file + - "not much" diff -Nru calamares-3.2.1/src/modules/dummypython/dummypython.conf calamares-3.2.2/src/modules/dummypython/dummypython.conf --- calamares-3.2.1/src/modules/dummypython/dummypython.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/dummypython/dummypython.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,3 +1,6 @@ +# This is a dummy (example) module for a Python Job Module. +# +# The code is the documentation for the configuration file. --- syntax: "YAML map of anything" example: @@ -15,4 +18,4 @@ - "another element" - name: "another item" contents: - - "not much" \ No newline at end of file + - "not much" diff -Nru calamares-3.2.1/src/modules/dummypythonqt/dummypythonqt.conf calamares-3.2.2/src/modules/dummypythonqt/dummypythonqt.conf --- calamares-3.2.1/src/modules/dummypythonqt/dummypythonqt.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/dummypythonqt/dummypythonqt.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,3 +1,6 @@ +# This is a dummy (example) module for PythonQt. +# +# The code is the documentation for the configuration file. --- syntax: "YAML map of anything" example: Binary files /tmp/tmpwCRwwi/nILc878j4a/calamares-3.2.1/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo and /tmp/tmpwCRwwi/PZJg37wy9E/calamares-3.2.2/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.mo differ diff -Nru calamares-3.2.1/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po calamares-3.2.2/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po --- calamares-3.2.1/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/dummypythonqt/lang/pt_BR/LC_MESSAGES/dummypythonqt.po 2018-09-04 12:03:59.000000000 +0000 @@ -8,9 +8,9 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-16 11:40-0400\n" +"POT-Creation-Date: 2018-06-18 07:46-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Guilherme , 2017\n" +"Last-Translator: Guilherme Marçal Silva , 2017\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/calamares/teams/20061/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff -Nru calamares-3.2.1/src/modules/fstab/fstab.conf calamares-3.2.2/src/modules/fstab/fstab.conf --- calamares-3.2.1/src/modules/fstab/fstab.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/fstab/fstab.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,13 +1,28 @@ +# Creates /etc/fstab and /etc/crypttab in the target system. +# Also creates mount points for all the filesystems. +# +# When creating fstab entries for a filesystem, this module +# uses the options for the filesystem type to write to the +# options field of the file. --- +# Mount options to use for all filesystems. If a specific filesystem +# is listed here, use those options, otherwise use the *default* +# options from this mapping. mountOptions: default: defaults,noatime btrfs: defaults,noatime,space_cache,autodefrag + +# If a filesystem is on an SSD, add the following options. If a specific +# filesystem is listed here, use those options, otherwise no additional +# options are set (i.e. there is no *default* like in *mountOptions*). ssdExtraMountOptions: ext4: discard jfs: discard xfs: discard swap: discard btrfs: discard,compress=lzo + +# Additional options added to each line in /etc/crypttab crypttabOptions: luks # For Debian and Debian-based distributions, change the above line to: # crypttabOptions: luks,keyscript=/bin/cat diff -Nru calamares-3.2.1/src/modules/grubcfg/grubcfg.conf calamares-3.2.2/src/modules/grubcfg/grubcfg.conf --- calamares-3.2.1/src/modules/grubcfg/grubcfg.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/grubcfg/grubcfg.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,10 +1,22 @@ +# Write lines to /etc/default/grub (in the target system) based +# on calculated values and the values set in the *defaults* key +# in this configuration file. +# +# Calculated values are: +# - GRUB_DISTRIBUTOR, branding module, *bootloaderEntryName* +# - GRUB_ENABLE_CRYPTODISK, based on the presence of filesystems +# that use LUKS +# - GRUB_CMDLINE_LINUX_DEFAULT, adding LUKS setup and plymouth +# support to the kernel. + --- # If set to true, always creates /etc/default/grub from scratch even if the file # already existed. If set to false, edits the existing file instead. overwrite: false + # Default entries to write to /etc/default/grub if it does not exist yet or if -# we are overwriting it. Note that in addition, GRUB_CMDLINE_LINUX_DEFAULT and -# GRUB_DISTRIBUTOR will always be written, with automatically detected values. +# we are overwriting it. +# defaults: GRUB_TIMEOUT: 5 GRUB_DEFAULT: "saved" diff -Nru calamares-3.2.1/src/modules/grubcfg/main.py calamares-3.2.2/src/modules/grubcfg/main.py --- calamares-3.2.1/src/modules/grubcfg/main.py 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/grubcfg/main.py 2018-09-04 12:03:59.000000000 +0000 @@ -62,6 +62,12 @@ cryptdevice_params = [] + # GRUB needs to decrypt the partition that /boot is on, which may be / or /boot + boot_mountpoint = "/" + for partition in partitions: + if partition["mountPoint"] == "/boot": + boot_mountpoint = "/boot" + if have_dracut: for partition in partitions: has_luks = "luksMapperName" in partition @@ -72,7 +78,7 @@ swap_outer_uuid = partition["luksUuid"] swap_outer_mappername = partition["luksMapperName"] - if (partition["mountPoint"] == "/" and has_luks): + if (partition["mountPoint"] == boot_mountpoint and has_luks): cryptdevice_params = [ "rd.luks.uuid={!s}".format(partition["luksUuid"]) ] @@ -82,7 +88,7 @@ if partition["fs"] == "linuxswap" and not has_luks: swap_uuid = partition["uuid"] - if (partition["mountPoint"] == "/" and has_luks): + if (partition["mountPoint"] == boot_mountpoint and has_luks): cryptdevice_params = [ "cryptdevice=UUID={!s}:{!s}".format( partition["luksUuid"], partition["luksMapperName"] diff -Nru calamares-3.2.1/src/modules/initcpio/initcpio.conf calamares-3.2.2/src/modules/initcpio/initcpio.conf --- calamares-3.2.1/src/modules/initcpio/initcpio.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/initcpio/initcpio.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,2 +1,3 @@ +# Run mkinitcpio(8) with the given preset value --- kernel: linux312 diff -Nru calamares-3.2.1/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.conf calamares-3.2.2/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.conf --- calamares-3.2.1/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/luksopenswaphookcfg/luksopenswaphookcfg.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,2 +1,4 @@ +# Writes an openswap configuration with LUKS settings to the given path --- +# Path of the configuration file to write (in the target system) configFilePath: /etc/openswap.conf diff -Nru calamares-3.2.1/src/modules/mount/mount.conf calamares-3.2.2/src/modules/mount/mount.conf --- calamares-3.2.1/src/modules/mount/mount.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/mount/mount.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,4 +1,18 @@ +# Mount filesystems in the target (generally, before treating the +# target as a usable chroot / "live" system). Filesystems are +# automatically mounted from the partitioning module. Filesystems +# listed here are **extra**. The filesystems listed in *extraMounts* +# are mounted in all target systems. The filesystems listed in +# *extraMountsEfi* are mounted in the target system **only** if +# the host machine uses UEFI. --- +# Extra filesystems to mount. The key's value is a list of entries; each +# entry has four keys: +# - device The device node to mount +# - fs The filesystem type to use +# - mountPoint Where to mount the filesystem +# - options (optional) Extra options to pass to mount(8) +# extraMounts: - device: proc fs: proc diff -Nru calamares-3.2.1/src/modules/partition/CMakeLists.txt calamares-3.2.2/src/modules/partition/CMakeLists.txt --- calamares-3.2.1/src/modules/partition/CMakeLists.txt 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/CMakeLists.txt 2018-09-04 12:03:59.000000000 +0000 @@ -12,6 +12,10 @@ ) if ( KPMcore_FOUND ) + if ( KPMcore_VERSION VERSION_GREATER "3.3.0") + add_definitions(-DWITH_KPMCOREGT33) # kpmcore greater than 3.3 + endif() + include_directories( ${KPMCORE_INCLUDE_DIR} ) include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui ) @@ -35,9 +39,11 @@ gui/BootInfoWidget.cpp gui/ChoicePage.cpp gui/CreatePartitionDialog.cpp + gui/CreateVolumeGroupDialog.cpp gui/DeviceInfoWidget.cpp gui/EditExistingPartitionDialog.cpp gui/EncryptWidget.cpp + gui/ListPhysicalVolumeWidgetItem.cpp gui/PartitionPage.cpp gui/PartitionBarsView.cpp gui/PartitionDialogHelpers.cpp @@ -46,17 +52,23 @@ gui/PartitionSplitterWidget.cpp gui/PartitionViewStep.cpp gui/PrettyRadioButton.cpp + gui/ResizeVolumeGroupDialog.cpp gui/ScanningDialog.cpp gui/ReplaceWidget.cpp + gui/VolumeGroupBaseDialog.cpp jobs/ClearMountsJob.cpp jobs/ClearTempMountsJob.cpp jobs/CreatePartitionJob.cpp jobs/CreatePartitionTableJob.cpp + jobs/CreateVolumeGroupJob.cpp + jobs/DeactivateVolumeGroupJob.cpp jobs/DeletePartitionJob.cpp jobs/FillGlobalStorageJob.cpp jobs/FormatPartitionJob.cpp jobs/PartitionJob.cpp + jobs/RemoveVolumeGroupJob.cpp jobs/ResizePartitionJob.cpp + jobs/ResizeVolumeGroupJob.cpp jobs/SetPartitionFlagsJob.cpp UI gui/ChoicePage.ui @@ -66,6 +78,7 @@ gui/EncryptWidget.ui gui/PartitionPage.ui gui/ReplaceWidget.ui + gui/VolumeGroupBaseDialog.ui LINK_PRIVATE_LIBRARIES kpmcore calamaresui diff -Nru calamares-3.2.1/src/modules/partition/core/DeviceList.cpp calamares-3.2.2/src/modules/partition/core/DeviceList.cpp --- calamares-3.2.1/src/modules/partition/core/DeviceList.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/DeviceList.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -98,8 +98,7 @@ { Device* p = *it; auto r = l.erase( it ); - if (p) - delete p; + delete p; return r; } diff -Nru calamares-3.2.1/src/modules/partition/core/DeviceModel.cpp calamares-3.2.2/src/modules/partition/core/DeviceModel.cpp --- calamares-3.2.1/src/modules/partition/core/DeviceModel.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/DeviceModel.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -29,6 +29,7 @@ // KF5 #include +#include #include // STL @@ -77,10 +78,18 @@ if ( device->name().isEmpty() ) return device->deviceNode(); else - return tr( "%1 - %2 (%3)" ) - .arg( device->name() ) - .arg( KFormat().formatByteSize( device->capacity() ) ) - .arg( device->deviceNode() ); + { + if ( device->logicalSize() >= 0 && device->totalLogical() >= 0 ) + return tr( "%1 - %2 (%3)" ) + .arg( device->name() ) + .arg( KFormat().formatByteSize( device->capacity() ) ) + .arg( device->deviceNode() ); + // Newly LVM VGs don't have capacity property yet (i.e. always has 1B capacity), so don't show it for a while + else + return tr( "%1 - (%2)" ) + .arg( device->name() ) + .arg( device->deviceNode() ); + } case Qt::DecorationRole: return CalamaresUtils::defaultPixmap( CalamaresUtils::PartitionDisk, CalamaresUtils::Original, @@ -116,3 +125,31 @@ emit dataChanged( index( indexOfOldDevice ), index( indexOfOldDevice ) ); } + +void +DeviceModel::addDevice( Device *device ) +{ + beginResetModel(); + + m_devices << device; + std::sort( m_devices.begin(), m_devices.end(), []( const Device* dev1, const Device* dev2 ) + { + return dev1->deviceNode() < dev2->deviceNode(); + } ); + + endResetModel(); +} + +void +DeviceModel::removeDevice( Device *device ) +{ + beginResetModel(); + + m_devices.removeAll( device ); + std::sort( m_devices.begin(), m_devices.end(), []( const Device* dev1, const Device* dev2 ) + { + return dev1->deviceNode() < dev2->deviceNode(); + } ); + + endResetModel(); +} diff -Nru calamares-3.2.1/src/modules/partition/core/DeviceModel.h calamares-3.2.2/src/modules/partition/core/DeviceModel.h --- calamares-3.2.1/src/modules/partition/core/DeviceModel.h 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/DeviceModel.h 2018-09-04 12:03:59.000000000 +0000 @@ -49,6 +49,10 @@ void swapDevice( Device* oldDevice, Device* newDevice ); + void addDevice( Device* device ); + + void removeDevice( Device* device ); + private: QList< Device* > m_devices; }; diff -Nru calamares-3.2.1/src/modules/partition/core/PartitionActions.cpp calamares-3.2.2/src/modules/partition/core/PartitionActions.cpp --- calamares-3.2.1/src/modules/partition/core/PartitionActions.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/PartitionActions.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -90,17 +90,35 @@ suggestedSwapSizeB *= overestimationFactor; // don't use more than 10% of available space - qreal maxSwapDiskRatio = 1.10; + qreal maxSwapDiskRatio = 0.10; qint64 maxSwapSizeB = availableSpaceB * maxSwapDiskRatio; if ( suggestedSwapSizeB > maxSwapSizeB ) suggestedSwapSizeB = maxSwapSizeB; } - cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. /1024. << "GiB"; + cDebug() << "Suggested swap size:" << suggestedSwapSizeB / 1024. / 1024. / 1024. << "GiB"; return suggestedSwapSizeB; } +constexpr qint64 +alignBytesToBlockSize( qint64 bytes, qint64 blocksize ) +{ + Q_ASSERT( bytes >= 0 ); + Q_ASSERT( blocksize > 0 ); + qint64 blocks = bytes / blocksize; + Q_ASSERT( blocks >= 0 ); + + if ( blocks * blocksize != bytes ) + ++blocks; + return blocks * blocksize; +} + +constexpr qint64 +bytesToSectors( qint64 bytes, qint64 blocksize ) +{ + return alignBytesToBlockSize( alignBytesToBlockSize( bytes, blocksize), MiBtoBytes(1) ) / blocksize; +} void doAutopartition( PartitionCoreModule* core, Device* dev, const QString& luksPassphrase ) @@ -114,25 +132,26 @@ defaultFsType = "ext4"; // Partition sizes are expressed in MiB, should be multiples of - // the logical sector size (usually 512B). - int uefisys_part_size = 0; - int empty_space_size = 0; - if ( isEfi ) - { - uefisys_part_size = 300; - empty_space_size = 2; - } - else - { - // we start with a 1MiB offset before the first partition - empty_space_size = 1; - } - - qint64 firstFreeSector = MiBtoBytes(empty_space_size) / dev->logicalSize() + 1; + // the logical sector size (usually 512B). EFI starts with 2MiB + // empty and a 300MiB EFI boot partition, while BIOS starts at + // the 1MiB boundary (usually sector 2048). + int uefisys_part_size = isEfi ? 300 : 0; + int empty_space_size = isEfi ? 2 : 1; + + // Since sectors count from 0, if the space is 2048 sectors in size, + // the first free sector has number 2048 (and there are 2048 sectors + // before that one, numbered 0..2047). + qint64 firstFreeSector = bytesToSectors( MiBtoBytes(empty_space_size), dev->logicalSize() ); if ( isEfi ) { - qint64 lastSector = firstFreeSector + ( MiBtoBytes(uefisys_part_size) / dev->logicalSize() ); + qint64 efiSectorCount = bytesToSectors( MiBtoBytes(uefisys_part_size), dev->logicalSize() ); + Q_ASSERT( efiSectorCount > 0 ); + + // Since sectors count from 0, and this partition is created starting + // at firstFreeSector, we need efiSectorCount sectors, numbered + // firstFreeSector..firstFreeSector+efiSectorCount-1. + qint64 lastSector = firstFreeSector + efiSectorCount - 1; core->createPartitionTable( dev, PartitionTable::gpt ); Partition* efiPartition = KPMHelpers::createNewPartition( dev->partitionTable(), @@ -141,12 +160,12 @@ FileSystem::Fat32, firstFreeSector, lastSector, - PartitionTable::FlagEsp + PartitionTable::FlagNone ); PartitionInfo::setFormat( efiPartition, true ); PartitionInfo::setMountPoint( efiPartition, gs->value( "efiSystemPartition" ) .toString() ); - core->createPartition( dev, efiPartition, PartitionTable::FlagEsp | PartitionTable::FlagBoot ); + core->createPartition( dev, efiPartition, PartitionTable::FlagEsp ); firstFreeSector = lastSector + 1; } else @@ -162,8 +181,11 @@ { qint64 availableSpaceB = ( dev->totalLogical() - firstFreeSector ) * dev->logicalSize(); suggestedSwapSizeB = swapSuggestion( availableSpaceB ); + // Space required by this installation is what the distro claims is needed + // (via global configuration) plus the swap size plus a fudge factor of + // 0.6GiB (this was 2.1GiB up to Calamares 3.2.2). qint64 requiredSpaceB = - GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() + 0.1 + 2.0 ) + + GiBtoBytes( gs->value( "requiredStorageGB" ).toDouble() + 0.6 ) + suggestedSwapSizeB; // If there is enough room for ESP + root + swap, create swap, otherwise don't. diff -Nru calamares-3.2.1/src/modules/partition/core/PartitionCoreModule.cpp calamares-3.2.2/src/modules/partition/core/PartitionCoreModule.cpp --- calamares-3.2.1/src/modules/partition/core/PartitionCoreModule.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/PartitionCoreModule.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -34,10 +34,14 @@ #include "jobs/ClearTempMountsJob.h" #include "jobs/CreatePartitionJob.h" #include "jobs/CreatePartitionTableJob.h" +#include "jobs/CreateVolumeGroupJob.h" +#include "jobs/DeactivateVolumeGroupJob.h" #include "jobs/DeletePartitionJob.h" #include "jobs/FillGlobalStorageJob.h" #include "jobs/FormatPartitionJob.h" +#include "jobs/RemoveVolumeGroupJob.h" #include "jobs/ResizePartitionJob.h" +#include "jobs/ResizeVolumeGroupJob.h" #include "jobs/SetPartitionFlagsJob.h" #include "Typedefs.h" @@ -45,10 +49,13 @@ // KPMcore #include +#include #include #include #include #include +#include +#include // Qt #include @@ -57,11 +64,44 @@ #include #include + +PartitionCoreModule::RefreshHelper::RefreshHelper(PartitionCoreModule* module) + : m_module( module ) +{ +} + +PartitionCoreModule::RefreshHelper::~RefreshHelper() +{ + m_module->refreshAfterModelChange(); +} + +class OperationHelper +{ +public: + OperationHelper( PartitionModel* model, PartitionCoreModule* core ) + : m_coreHelper( core ) + , m_modelHelper( model ) + { + } + + OperationHelper( const OperationHelper& ) = delete; + OperationHelper& operator=( const OperationHelper& ) = delete; + +private: + // Keep these in order: first the model needs to finish, + // then refresh is called. Remember that destructors are + // called in *reverse* order of declaration in this class. + PartitionCoreModule::RefreshHelper m_coreHelper; + PartitionModel::ResetHelper m_modelHelper; +} ; + + //- DeviceInfo --------------------------------------------- PartitionCoreModule::DeviceInfo::DeviceInfo( Device* _device ) : device( _device ) , partitionModel( new PartitionModel ) , immutableDevice( new Device( *_device ) ) + , isAvailable( true ) {} PartitionCoreModule::DeviceInfo::~DeviceInfo() @@ -178,6 +218,8 @@ m_bootLoaderModel->init( bootLoaderDevices ); + scanForLVMPVs(); + //FIXME: this should be removed in favor of // proper KPM support for EFI if ( PartUtils::isEfiSystem() ) @@ -232,13 +274,11 @@ // keep previous changes info->forgetChanges(); - PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); + OperationHelper helper( partitionModelForDevice( device ), this ); CreatePartitionTableJob* job = new CreatePartitionTableJob( device, type ); job->updatePreview(); info->jobs << Calamares::job_ptr( job ); } - - refresh(); } void @@ -249,7 +289,7 @@ auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); - PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); + OperationHelper helper( partitionModelForDevice( device ), this ); CreatePartitionJob* job = new CreatePartitionJob( device, partition ); job->updatePreview(); @@ -261,8 +301,77 @@ deviceInfo->jobs << Calamares::job_ptr( fJob ); PartitionInfo::setFlags( partition, flags ); } +} + +void +PartitionCoreModule::createVolumeGroup( QString &vgName, + QVector< const Partition* > pvList, + qint32 peSize ) +{ + // Appending '_' character in case of repeated VG name + while ( hasVGwithThisName( vgName ) ) + vgName.append('_'); + + CreateVolumeGroupJob* job = new CreateVolumeGroupJob( vgName, pvList, peSize ); + job->updatePreview(); + + LvmDevice* device = new LvmDevice(vgName); + + for ( const Partition* p : pvList ) + device->physicalVolumes() << p; + + DeviceInfo* deviceInfo = new DeviceInfo( device ); + + deviceInfo->partitionModel->init( device, osproberEntries() ); + + m_deviceModel->addDevice( device ); + + m_deviceInfos << deviceInfo; + deviceInfo->jobs << Calamares::job_ptr( job ); + + refreshAfterModelChange(); +} + +void +PartitionCoreModule::resizeVolumeGroup( LvmDevice *device, QVector< const Partition* >& pvList ) +{ + DeviceInfo* deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); - refresh(); + ResizeVolumeGroupJob* job = new ResizeVolumeGroupJob( device, pvList ); + + deviceInfo->jobs << Calamares::job_ptr( job ); + + refreshAfterModelChange(); +} + +void +PartitionCoreModule::deactivateVolumeGroup( LvmDevice *device ) +{ + DeviceInfo* deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); + + deviceInfo->isAvailable = false; + + DeactivateVolumeGroupJob* job = new DeactivateVolumeGroupJob( device ); + + // DeactivateVolumeGroupJob needs to be immediately called + job->exec(); + + refreshAfterModelChange(); +} + +void +PartitionCoreModule::removeVolumeGroup( LvmDevice *device ) +{ + DeviceInfo* deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); + + RemoveVolumeGroupJob* job = new RemoveVolumeGroupJob( device ); + + deviceInfo->jobs << Calamares::job_ptr( job ); + + refreshAfterModelChange(); } void @@ -271,7 +380,7 @@ auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); - PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); + OperationHelper helper( partitionModelForDevice( device ), this ); if ( partition->roles().has( PartitionRole::Extended ) ) { @@ -339,8 +448,6 @@ job->updatePreview(); jobs << Calamares::job_ptr( job ); } - - refresh(); } void @@ -348,12 +455,10 @@ { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); - PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); + OperationHelper helper( partitionModelForDevice( device ), this ); FormatPartitionJob* job = new FormatPartitionJob( device, partition ); deviceInfo->jobs << Calamares::job_ptr( job ); - - refresh(); } void @@ -364,13 +469,11 @@ { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); - PartitionModel::ResetHelper helper( partitionModelForDevice( device ) ); + OperationHelper helper( partitionModelForDevice( device ), this ); ResizePartitionJob* job = new ResizePartitionJob( device, partition, first, last ); job->updatePreview(); deviceInfo->jobs << Calamares::job_ptr( job ); - - refresh(); } void @@ -380,13 +483,11 @@ { auto deviceInfo = infoForDevice( device ); Q_ASSERT( deviceInfo ); - PartitionModel::ResetHelper( partitionModelForDevice( device ) ); + OperationHelper( partitionModelForDevice( device ), this ); SetPartFlagsJob* job = new SetPartFlagsJob( device, partition, flags ); deviceInfo->jobs << Calamares::job_ptr( job ); PartitionInfo::setFlags( partition, flags ); - - refresh(); } QList< Calamares::job_ptr > @@ -434,6 +535,37 @@ return m_efiSystemPartitions; } +QVector< const Partition* > +PartitionCoreModule::lvmPVs() const +{ + return m_lvmPVs; +} + +bool +PartitionCoreModule::hasVGwithThisName( const QString& name ) const +{ + for ( DeviceInfo* d : m_deviceInfos ) + if ( dynamic_cast(d->device.data()) && + d->device.data()->name() == name) + return true; + + return false; +} + +bool +PartitionCoreModule::isInVG( const Partition *partition ) const +{ + for ( DeviceInfo* d : m_deviceInfos ) + { + LvmDevice* vg = dynamic_cast( d->device.data() ); + + if ( vg && vg->physicalVolumes().contains( partition )) + return true; + } + + return false; +} + void PartitionCoreModule::dumpQueue() const { @@ -461,18 +593,18 @@ // the loss of the current selection. auto model = partitionModelForDevice( device ); Q_ASSERT( model ); - PartitionModel::ResetHelper helper( model ); - - refresh(); + OperationHelper helper( model, this ); } void -PartitionCoreModule::refresh() +PartitionCoreModule::refreshAfterModelChange() { updateHasRootMountPoint(); updateIsDirty(); m_bootLoaderModel->update(); + scanForLVMPVs(); + //FIXME: this should be removed in favor of // proper KPM support for EFI if ( PartUtils::isEfiSystem() ) @@ -525,6 +657,84 @@ m_efiSystemPartitions = efiSystemPartitions; } +void +PartitionCoreModule::scanForLVMPVs() +{ + m_lvmPVs.clear(); + + QList< Device* > physicalDevices; + QList< LvmDevice* > vgDevices; + + for ( DeviceInfo* deviceInfo : m_deviceInfos ) + { + if ( deviceInfo->device.data()->type() == Device::Type::Disk_Device) + physicalDevices << deviceInfo->device.data(); + else if ( deviceInfo->device.data()->type() == Device::Type::LVM_Device ) + { + LvmDevice* device = dynamic_cast(deviceInfo->device.data()); + + // Restoring physical volume list + device->physicalVolumes().clear(); + + vgDevices << device; + } + } + + // Update LVM::pvList + LvmDevice::scanSystemLVM( physicalDevices ); + +#ifdef WITH_KPMCOREGT33 + for ( auto p : LVM::pvList::list() ) +#else + for ( auto p : LVM::pvList ) +#endif + { + m_lvmPVs << p.partition().data(); + + for ( LvmDevice* device : vgDevices ) + if ( p.vgName() == device->name() ) + { + // Adding scanned VG to PV list + device->physicalVolumes() << p.partition(); + break; + } + } + + for ( DeviceInfo* d : m_deviceInfos ) + { + for ( auto job : d->jobs ) + { + // Including new LVM PVs + CreatePartitionJob* partJob = dynamic_cast( job.data() ); + if ( partJob ) + { + Partition* p = partJob->partition(); + + if ( p->fileSystem().type() == FileSystem::Type::Lvm2_PV ) + m_lvmPVs << p; + else if ( p->fileSystem().type() == FileSystem::Type::Luks ) + { + // Encrypted LVM PVs + FileSystem* innerFS = static_cast(&p->fileSystem())->innerFS(); + + if ( innerFS && innerFS->type() == FileSystem::Type::Lvm2_PV ) + m_lvmPVs << p; + } +#ifdef WITH_KPMCOREGT33 + else if ( p->fileSystem().type() == FileSystem::Type::Luks2 ) + { + // Encrypted LVM PVs + FileSystem* innerFS = static_cast(&p->fileSystem())->innerFS(); + + if ( innerFS && innerFS->type() == FileSystem::Type::Lvm2_PV ) + m_lvmPVs << p; + } +#endif + } + } + } +} + PartitionCoreModule::DeviceInfo* PartitionCoreModule::infoForDevice( const Device* device ) const { @@ -574,9 +784,37 @@ void PartitionCoreModule::revertAllDevices() { - foreach ( DeviceInfo* devInfo, m_deviceInfos ) - revertDevice( devInfo->device.data() ); - refresh(); + for ( auto it = m_deviceInfos.begin(); it != m_deviceInfos.end(); ) + { + // In new VGs device info, there will be always a CreateVolumeGroupJob as the first job in jobs list + if ( dynamic_cast( ( *it )->device.data() ) ) + { + ( *it )->isAvailable = true; + + if ( !( *it )->jobs.empty() ) + { + CreateVolumeGroupJob* vgJob = dynamic_cast( ( *it )->jobs[0].data() ); + + if ( vgJob ) + { + vgJob->undoPreview(); + + ( *it )->forgetChanges(); + + m_deviceModel->removeDevice( ( *it )->device.data() ); + + it = m_deviceInfos.erase( it ); + + continue; + } + } + } + + revertDevice( ( *it )->device.data() ); + ++it; + } + + refreshAfterModelChange(); } @@ -585,6 +823,7 @@ { QMutexLocker locker( &m_revertMutex ); DeviceInfo* devInfo = infoForDevice( dev ); + if ( !devInfo ) return; devInfo->forgetChanges(); @@ -596,12 +835,17 @@ m_deviceModel->swapDevice( dev, newDev ); QList< Device* > devices; - foreach ( auto info, m_deviceInfos ) - devices.append( info->device.data() ); + for ( auto info : m_deviceInfos ) + { + if ( info->device.data()->type() != Device::Type::Disk_Device ) + continue; + else + devices.append( info->device.data() ); + } m_bootLoaderModel->init( devices ); - refresh(); + refreshAfterModelChange(); emit deviceReverted( newDev ); } @@ -637,6 +881,16 @@ return m_isDirty; } +bool +PartitionCoreModule::isVGdeactivated( LvmDevice *device ) +{ + for ( DeviceInfo* deviceInfo : m_deviceInfos ) + if ( device == deviceInfo->device.data() && !deviceInfo->isAvailable ) + return true; + + return false; +} + QList< PartitionCoreModule::SummaryInfo > PartitionCoreModule::createSummaryInfo() const { diff -Nru calamares-3.2.1/src/modules/partition/core/PartitionCoreModule.h calamares-3.2.2/src/modules/partition/core/PartitionCoreModule.h --- calamares-3.2.1/src/modules/partition/core/PartitionCoreModule.h 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/PartitionCoreModule.h 2018-09-04 12:03:59.000000000 +0000 @@ -24,6 +24,7 @@ #include "Typedefs.h" // KPMcore +#include #include // Qt @@ -54,6 +55,25 @@ Q_OBJECT public: /** + * This helper class calls refresh() on the module + * on destruction (nothing else). It is used as + * part of the model-consistency objects, along with + * PartitionModel::ResetHelper. + */ + class RefreshHelper + { + public: + RefreshHelper( PartitionCoreModule* module ); + ~RefreshHelper(); + + RefreshHelper( const RefreshHelper& ) = delete; + RefreshHelper& operator=( const RefreshHelper& ) = delete; + + private: + PartitionCoreModule* m_module; + }; + + /** * @brief The SummaryInfo struct is a wrapper for PartitionModel instances for * a given Device. * Each Device gets a mutable "after" model and an immutable "before" model. @@ -111,6 +131,14 @@ void createPartition( Device* device, Partition* partition, PartitionTable::Flags flags = PartitionTable::FlagNone ); + void createVolumeGroup( QString &vgName, QVector< const Partition* > pvList, qint32 peSize ); + + void resizeVolumeGroup( LvmDevice* device, QVector< const Partition* >& pvList ); + + void deactivateVolumeGroup( LvmDevice* device ); + + void removeVolumeGroup( LvmDevice* device ); + void deletePartition( Device* device, Partition* partition ); void formatPartition( Device* device, Partition* partition ); @@ -132,6 +160,12 @@ QList< Partition* > efiSystemPartitions() const; + QVector< const Partition* > lvmPVs() const; + + bool hasVGwithThisName( const QString& name ) const; + + bool isInVG( const Partition* partition ) const; + /** * @brief findPartitionByMountPoint returns a Partition* for a given mount point. * @param mountPoint the mount point to find a partition for. @@ -151,6 +185,8 @@ bool isDirty(); // true if there are pending changes, otherwise false + bool isVGdeactivated( LvmDevice* device ); + /** * To be called when a partition has been altered, but only for changes * which do not affect its size, because changes which affect the partition size @@ -175,7 +211,7 @@ void deviceReverted( Device* device ); private: - void refresh(); + void refreshAfterModelChange(); /** * Owns the Device, PartitionModel and the jobs @@ -189,11 +225,15 @@ const QScopedPointer< Device > immutableDevice; QList< Calamares::job_ptr > jobs; + // To check if LVM VGs are deactivated + bool isAvailable; + void forgetChanges(); bool isDirty() const; }; QList< DeviceInfo* > m_deviceInfos; QList< Partition* > m_efiSystemPartitions; + QVector< const Partition* > m_lvmPVs; DeviceModel* m_deviceModel; BootLoaderModel* m_bootLoaderModel; @@ -205,6 +245,7 @@ void updateHasRootMountPoint(); void updateIsDirty(); void scanForEfiSystemPartitions(); + void scanForLVMPVs(); DeviceInfo* infoForDevice( const Device* ) const; diff -Nru calamares-3.2.1/src/modules/partition/core/PartitionInfo.cpp calamares-3.2.2/src/modules/partition/core/PartitionInfo.cpp --- calamares-3.2.1/src/modules/partition/core/PartitionInfo.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/core/PartitionInfo.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -20,6 +20,7 @@ #include "core/PartitionInfo.h" // KPMcore +#include #include // Qt @@ -80,6 +81,9 @@ bool isDirty( Partition* partition ) { + if ( LvmDevice::s_DirtyPVs.contains( partition ) ) + return true; + return !mountPoint( partition ).isEmpty() || format( partition ) || flags( partition ) != partition->activeFlags(); diff -Nru calamares-3.2.1/src/modules/partition/gui/CreateVolumeGroupDialog.cpp calamares-3.2.2/src/modules/partition/gui/CreateVolumeGroupDialog.cpp --- calamares-3.2.1/src/modules/partition/gui/CreateVolumeGroupDialog.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/CreateVolumeGroupDialog.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,56 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "CreateVolumeGroupDialog.h" + +#include +#include + +#include +#include +#include + +CreateVolumeGroupDialog::CreateVolumeGroupDialog( QString& vgName, + QVector< const Partition* >& selectedPVs, + QVector< const Partition* > pvList, + qint64& pSize, + QWidget* parent ) + : VolumeGroupBaseDialog( vgName, pvList, parent ) + , m_selectedPVs( selectedPVs ) + , m_peSize( pSize ) +{ + setWindowTitle( "Create Volume Group" ); + + peSize()->setValue( pSize ); + + vgType()->setEnabled( false ); +} + +void +CreateVolumeGroupDialog::accept() +{ + QString& name = vgNameValue(); + name = vgName()->text(); + + m_selectedPVs << checkedItems(); + + qint64& pe = m_peSize; + pe = peSize()->value(); + + QDialog::accept(); +} diff -Nru calamares-3.2.1/src/modules/partition/gui/CreateVolumeGroupDialog.h calamares-3.2.2/src/modules/partition/gui/CreateVolumeGroupDialog.h --- calamares-3.2.1/src/modules/partition/gui/CreateVolumeGroupDialog.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/CreateVolumeGroupDialog.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,41 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef CREATEVOLUMEGROUPDIALOG_H +#define CREATEVOLUMEGROUPDIALOG_H + +#include "gui/VolumeGroupBaseDialog.h" + +class CreateVolumeGroupDialog : public VolumeGroupBaseDialog +{ +public: + CreateVolumeGroupDialog( QString& vgName, + QVector< const Partition* >& selectedPVs, + QVector< const Partition* > pvList, + qint64& pSize, + QWidget* parent ); + + void accept() override; + +private: + QVector< const Partition* >& m_selectedPVs; + + qint64& m_peSize; +}; + +#endif // CREATEVOLUMEGROUPDIALOG_H diff -Nru calamares-3.2.1/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp calamares-3.2.2/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp --- calamares-3.2.1/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,36 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "ListPhysicalVolumeWidgetItem.h" + +#include + +ListPhysicalVolumeWidgetItem::ListPhysicalVolumeWidgetItem( const Partition* partition, bool checked ) + : QListWidgetItem(QString("%1 | %2").arg( partition->deviceNode(), Capacity::formatByteSize( partition->capacity() ))) + , m_partition(partition) +{ + setToolTip( partition->deviceNode() ); + setSizeHint( QSize(0, 32) ); + setCheckState( checked ? Qt::Checked : Qt::Unchecked ); +} + +const Partition* +ListPhysicalVolumeWidgetItem::partition() const +{ + return m_partition; +} diff -Nru calamares-3.2.1/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h calamares-3.2.2/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h --- calamares-3.2.1/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/ListPhysicalVolumeWidgetItem.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,37 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef LISTPHYSICALVOLUMEWIDGETITEM_H +#define LISTPHYSICALVOLUMEWIDGETITEM_H + +#include + +#include + +class ListPhysicalVolumeWidgetItem : public QListWidgetItem +{ +public: + ListPhysicalVolumeWidgetItem( const Partition* partition, bool checked ); + + const Partition* partition() const; + +private: + const Partition* m_partition; +}; + +#endif // LISTPHYSICALVOLUMEWIDGETITEM_H diff -Nru calamares-3.2.1/src/modules/partition/gui/PartitionPage.cpp calamares-3.2.2/src/modules/partition/gui/PartitionPage.cpp --- calamares-3.2.1/src/modules/partition/gui/PartitionPage.cpp 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/PartitionPage.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -30,7 +30,9 @@ #include "core/PartUtils.h" #include "core/KPMHelpers.h" #include "gui/CreatePartitionDialog.h" +#include "gui/CreateVolumeGroupDialog.h" #include "gui/EditExistingPartitionDialog.h" +#include "gui/ResizeVolumeGroupDialog.h" #include "gui/ScanningDialog.h" #include "ui_PartitionPage.h" @@ -45,6 +47,8 @@ // KPMcore #include #include +#include +#include // Qt #include @@ -102,6 +106,10 @@ connect( m_ui->partitionTreeView, &QAbstractItemView::doubleClicked, this, &PartitionPage::onPartitionViewActivated ); connect( m_ui->revertButton, &QAbstractButton::clicked, this, &PartitionPage::onRevertClicked ); + connect( m_ui->newVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onNewVolumeGroupClicked ); + connect( m_ui->resizeVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onResizeVolumeGroupClicked ); + connect( m_ui->deactivateVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onDeactivateVolumeGroupClicked ); + connect( m_ui->removeVolumeGroupButton, &QAbstractButton::clicked, this, &PartitionPage::onRemoveVolumeGroupClicked ); connect( m_ui->newPartitionTableButton, &QAbstractButton::clicked, this, &PartitionPage::onNewPartitionTableClicked ); connect( m_ui->createButton, &QAbstractButton::clicked, this, &PartitionPage::onCreateClicked ); connect( m_ui->editButton, &QAbstractButton::clicked, this, &PartitionPage::onEditClicked ); @@ -122,7 +130,8 @@ void PartitionPage::updateButtons() { - bool create = false, createTable = false, edit = false, del = false; + bool create = false, createTable = false, edit = false, del = false, currentDeviceIsVG = false, isDeactivable = false; + bool isRemovable = false, isVGdeactivated = false; QModelIndex index = m_ui->partitionTreeView->currentIndex(); if ( index.isValid() ) @@ -134,6 +143,8 @@ bool isFree = KPMHelpers::isPartitionFreeSpace( partition ); bool isExtended = partition->roles().has( PartitionRole::Extended ); + bool isInVG = m_core->isInVG( partition ); + create = isFree; // Keep it simple for now: do not support editing extended partitions as // it does not work with our current edit implementation which is @@ -141,8 +152,9 @@ // because they need to be created *before* creating logical partitions // inside them, so an edit must be applied without altering the job // order. + // TODO: See if LVM PVs can be edited in Calamares edit = !isFree && !isExtended; - del = !isFree; + del = !isFree && !isInVG; } if ( m_ui->deviceComboBox->currentIndex() >= 0 ) @@ -150,12 +162,29 @@ QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); if ( m_core->deviceModel()->deviceForIndex( deviceIndex )->type() != Device::Type::LVM_Device ) createTable = true; + else + { + currentDeviceIsVG = true; + + LvmDevice* lvmDevice = dynamic_cast(m_core->deviceModel()->deviceForIndex( deviceIndex )); + + isDeactivable = DeactivateVolumeGroupOperation::isDeactivatable( lvmDevice ); + isRemovable = RemoveVolumeGroupOperation::isRemovable( lvmDevice ); + + isVGdeactivated = m_core->isVGdeactivated( lvmDevice ); + + if ( isVGdeactivated ) + m_ui->revertButton->setEnabled( true ); + } } m_ui->createButton->setEnabled( create ); m_ui->editButton->setEnabled( edit ); m_ui->deleteButton->setEnabled( del ); m_ui->newPartitionTableButton->setEnabled( createTable ); + m_ui->resizeVolumeGroupButton->setEnabled( currentDeviceIsVG && !isVGdeactivated ); + m_ui->deactivateVolumeGroupButton->setEnabled( currentDeviceIsVG && isDeactivable && !isVGdeactivated ); + m_ui->removeVolumeGroupButton->setEnabled( currentDeviceIsVG && isRemovable ); } void @@ -205,6 +234,114 @@ } void +PartitionPage::onNewVolumeGroupClicked() +{ + QString vgName; + QVector< const Partition* > selectedPVs; + qint64 peSize = 4; + + QVector< const Partition* > availablePVs; + + for ( const Partition* p : m_core->lvmPVs() ) + if ( !m_core->isInVG( p ) ) + availablePVs << p; + + QPointer< CreateVolumeGroupDialog > dlg = new CreateVolumeGroupDialog( vgName, + selectedPVs, + availablePVs, + peSize, + this ); + + if ( dlg->exec() == QDialog::Accepted ) + { + QModelIndex partitionIndex = m_ui->partitionTreeView->currentIndex(); + + if ( partitionIndex.isValid() ) + { + const PartitionModel* model = static_cast< const PartitionModel* >( partitionIndex.model() ); + Q_ASSERT( model ); + Partition* partition = model->partitionForIndex( partitionIndex ); + Q_ASSERT( partition ); + + // Disable delete button if current partition was selected to be in VG + // TODO: Should Calamares edit LVM PVs which are in VGs? + if ( selectedPVs.contains( partition ) ) + m_ui->deleteButton->setEnabled( false ); + } + + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + Q_ASSERT( deviceIndex.isValid() ); + + QVariant previousIndexDeviceData = m_core->deviceModel()->data( deviceIndex, Qt::ToolTipRole ); + + // Creating new VG + m_core->createVolumeGroup( vgName, selectedPVs, peSize ); + + // As createVolumeGroup method call resets deviceModel, + // is needed to set the current index in deviceComboBox as the previous one + int previousIndex = m_ui->deviceComboBox->findData( previousIndexDeviceData, Qt::ToolTipRole ); + + m_ui->deviceComboBox->setCurrentIndex( ( previousIndex < 0 ) ? 0 : previousIndex ); + updateFromCurrentDevice(); + } + + delete dlg; +} + +void +PartitionPage::onResizeVolumeGroupClicked() +{ + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + LvmDevice* device = dynamic_cast< LvmDevice* >( m_core->deviceModel()->deviceForIndex( deviceIndex ) ); + + Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); + + QVector< const Partition* > availablePVs; + QVector< const Partition* > selectedPVs; + + for ( const Partition* p : m_core->lvmPVs() ) + if ( !m_core->isInVG( p ) ) + availablePVs << p; + + QPointer< ResizeVolumeGroupDialog > dlg = new ResizeVolumeGroupDialog( device, + availablePVs, + selectedPVs, + this ); + + if ( dlg->exec() == QDialog::Accepted ) + m_core->resizeVolumeGroup( device, selectedPVs ); + + delete dlg; +} + +void +PartitionPage::onDeactivateVolumeGroupClicked() +{ + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + LvmDevice* device = dynamic_cast< LvmDevice* >( m_core->deviceModel()->deviceForIndex( deviceIndex ) ); + + Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); + + m_core->deactivateVolumeGroup( device ); + + updateFromCurrentDevice(); + + PartitionModel* model = m_core->partitionModelForDevice( device ); + model->update(); +} + +void +PartitionPage::onRemoveVolumeGroupClicked() +{ + QModelIndex deviceIndex = m_core->deviceModel()->index( m_ui->deviceComboBox->currentIndex(), 0 ); + LvmDevice* device = dynamic_cast< LvmDevice* >( m_core->deviceModel()->deviceForIndex( deviceIndex ) ); + + Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); + + m_core->removeVolumeGroup( device ); +} + +void PartitionPage::onCreateClicked() { QModelIndex index = m_ui->partitionTreeView->currentIndex(); @@ -272,7 +409,7 @@ int oldIndex = m_ui->deviceComboBox->currentIndex(); m_core->revertAllDevices(); - m_ui->deviceComboBox->setCurrentIndex( oldIndex ); + m_ui->deviceComboBox->setCurrentIndex( ( oldIndex < 0 ) ? 0 : oldIndex ); updateFromCurrentDevice(); } ), [ this ]{ diff -Nru calamares-3.2.1/src/modules/partition/gui/PartitionPage.h calamares-3.2.2/src/modules/partition/gui/PartitionPage.h --- calamares-3.2.1/src/modules/partition/gui/PartitionPage.h 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/PartitionPage.h 2018-09-04 12:03:59.000000000 +0000 @@ -51,6 +51,10 @@ PartitionCoreModule* m_core; void updateButtons(); void onNewPartitionTableClicked(); + void onNewVolumeGroupClicked(); + void onResizeVolumeGroupClicked(); + void onDeactivateVolumeGroupClicked(); + void onRemoveVolumeGroupClicked(); void onCreateClicked(); void onEditClicked(); void onDeleteClicked(); diff -Nru calamares-3.2.1/src/modules/partition/gui/PartitionPage.ui calamares-3.2.2/src/modules/partition/gui/PartitionPage.ui --- calamares-3.2.1/src/modules/partition/gui/PartitionPage.ui 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/PartitionPage.ui 2018-09-04 12:03:59.000000000 +0000 @@ -6,7 +6,7 @@ 0 0 - 655 + 684 304 @@ -125,6 +125,38 @@ + + + + + New Volume Group + + + + + + + Resize Volume Group + + + + + + + Deactivate Volume Group + + + + + + + Remove Volume Group + + + + + + Qt::Vertical @@ -145,7 +177,7 @@ - Install boot &loader on: + I&nstall boot loader on: bootLoaderComboBox diff -Nru calamares-3.2.1/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp calamares-3.2.2/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp --- calamares-3.2.1/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,62 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "ResizeVolumeGroupDialog.h" + +#include "gui/ListPhysicalVolumeWidgetItem.h" + +#include +#include + +#include +#include +#include +#include + +ResizeVolumeGroupDialog::ResizeVolumeGroupDialog( LvmDevice *device, + QVector< const Partition* > availablePVs, + QVector< const Partition* >& selectedPVs, + QWidget* parent ) + : VolumeGroupBaseDialog( device->name(), device->physicalVolumes(), parent ) + , m_selectedPVs( selectedPVs ) +{ + setWindowTitle( "Resize Volume Group" ); + + for ( int i = 0; i < pvList()->count(); i++ ) + pvList()->item(i)->setCheckState( Qt::Checked ); + + for ( const Partition* p : availablePVs ) + pvList()->addItem( new ListPhysicalVolumeWidgetItem( p, false ) ); + + peSize()->setValue( device->peSize() / Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::MiB) ); + + vgName()->setEnabled( false ); + peSize()->setEnabled( false ); + vgType()->setEnabled( false ); + + setUsedSizeValue( device->allocatedPE() * device->peSize() ); + setLVQuantity( device->partitionTable()->children().count() ); +} + +void +ResizeVolumeGroupDialog::accept() +{ + m_selectedPVs << checkedItems(); + + QDialog::accept(); +} diff -Nru calamares-3.2.1/src/modules/partition/gui/ResizeVolumeGroupDialog.h calamares-3.2.2/src/modules/partition/gui/ResizeVolumeGroupDialog.h --- calamares-3.2.1/src/modules/partition/gui/ResizeVolumeGroupDialog.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/ResizeVolumeGroupDialog.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef RESIZEVOLUMEGROUPDIALOG_H +#define RESIZEVOLUMEGROUPDIALOG_H + +#include "gui/VolumeGroupBaseDialog.h" + +class LvmDevice; + +class ResizeVolumeGroupDialog : public VolumeGroupBaseDialog +{ +public: + ResizeVolumeGroupDialog( LvmDevice *device, + QVector< const Partition* > availablePVs, + QVector< const Partition* >& selectedPVs, + QWidget* parent ); + + void accept() override; + +private: + QVector< const Partition* >& m_selectedPVs; +}; + +#endif // RESIZEVOLUMEGROUPDIALOG_H diff -Nru calamares-3.2.1/src/modules/partition/gui/VolumeGroupBaseDialog.cpp calamares-3.2.2/src/modules/partition/gui/VolumeGroupBaseDialog.cpp --- calamares-3.2.1/src/modules/partition/gui/VolumeGroupBaseDialog.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/VolumeGroupBaseDialog.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,184 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "VolumeGroupBaseDialog.h" +#include "ui_VolumeGroupBaseDialog.h" + +#include "gui/ListPhysicalVolumeWidgetItem.h" + +#include + +#include +#include +#include +#include +#include +#include + +VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, + QVector< const Partition* > pvList, + QWidget *parent ) + : QDialog(parent) + , ui(new Ui::VolumeGroupBaseDialog) + , m_vgNameValue(vgName) + , m_totalSizeValue(0) + , m_usedSizeValue(0) +{ + ui->setupUi(this); + + for ( const Partition* p : pvList ) + ui->pvList->addItem( new ListPhysicalVolumeWidgetItem( p, false ) ); + + ui->vgType->addItems( QStringList() << "LVM" << "RAID" ); + ui->vgType->setCurrentIndex(0); + + QRegularExpression re(R"(^(?!_|\.)[\w\-.+]+)"); + ui->vgName->setValidator( new QRegularExpressionValidator( re, this ) ); + ui->vgName->setText( m_vgNameValue ); + + updateOkButton(); + updateTotalSize(); + + connect( ui->pvList, &QListWidget::itemChanged, this, + [&](QListWidgetItem*) { + updateTotalSize(); + updateOkButton(); + } ); + + connect( ui->peSize, qOverload(&QSpinBox::valueChanged), this, + [&](int) { + updateTotalSectors(); + updateOkButton(); + }); + + connect( ui->vgName, &QLineEdit::textChanged, this, + [&](const QString&) { + updateOkButton(); + }); +} + +VolumeGroupBaseDialog::~VolumeGroupBaseDialog() +{ + delete ui; +} + +QVector< const Partition* > +VolumeGroupBaseDialog::checkedItems() const +{ + QVector< const Partition* > items; + + for ( int i = 0; i < ui->pvList->count(); i++) { + ListPhysicalVolumeWidgetItem* item = dynamic_cast< ListPhysicalVolumeWidgetItem* >( ui->pvList->item(i) ); + + if ( item && item->checkState() == Qt::Checked ) + items << item->partition(); + } + + return items; +} + +bool +VolumeGroupBaseDialog::isSizeValid() const +{ + return m_totalSizeValue >= m_usedSizeValue; +} + +void +VolumeGroupBaseDialog::updateOkButton() +{ + okButton()->setEnabled(isSizeValid() && + !checkedItems().empty() && + !ui->vgName->text().isEmpty() && + ui->peSize->value() > 0); +} + +void +VolumeGroupBaseDialog::setUsedSizeValue( qint64 usedSize ) +{ + m_usedSizeValue = usedSize; + + ui->usedSize->setText( Capacity::formatByteSize(m_usedSizeValue) ); +} + +void +VolumeGroupBaseDialog::setLVQuantity( qint32 lvQuantity ) +{ + ui->lvQuantity->setText( QString::number( lvQuantity ) ); +} + +void +VolumeGroupBaseDialog::updateTotalSize() +{ + m_totalSizeValue = 0; + + for ( const Partition *p : checkedItems()) + m_totalSizeValue += p->capacity() - p->capacity() % (ui->peSize->value() * Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::MiB)); + + ui->totalSize->setText(Capacity::formatByteSize(m_totalSizeValue)); + + updateTotalSectors(); +} + +void +VolumeGroupBaseDialog::updateTotalSectors() +{ + qint32 totalSectors = 0; + + qint32 extentSize = ui->peSize->value() * Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::MiB); + + if ( extentSize > 0 ) + totalSectors = m_totalSizeValue / extentSize; + + ui->totalSectors->setText( QString::number( totalSectors ) ); +} + +QString& +VolumeGroupBaseDialog::vgNameValue() const +{ + return m_vgNameValue; +} + +QLineEdit* +VolumeGroupBaseDialog::vgName() const +{ + return ui->vgName; +} + +QComboBox* +VolumeGroupBaseDialog::vgType() const +{ + return ui->vgType; +} + +QSpinBox* +VolumeGroupBaseDialog::peSize() const +{ + return ui->peSize; +} + +QListWidget* +VolumeGroupBaseDialog::pvList() const +{ + return ui->pvList; +} + +QPushButton* +VolumeGroupBaseDialog::okButton() const +{ + return ui->buttonBox->button( QDialogButtonBox::StandardButton::Ok ); +} diff -Nru calamares-3.2.1/src/modules/partition/gui/VolumeGroupBaseDialog.h calamares-3.2.2/src/modules/partition/gui/VolumeGroupBaseDialog.h --- calamares-3.2.1/src/modules/partition/gui/VolumeGroupBaseDialog.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/VolumeGroupBaseDialog.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,81 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef VOLUMEGROUPBASEDIALOG_H +#define VOLUMEGROUPBASEDIALOG_H + +#include + +#include + +namespace Ui { +class VolumeGroupBaseDialog; +} + +class QComboBox; +class QLineEdit; +class QListWidget; +class QSpinBox; + +class VolumeGroupBaseDialog : public QDialog +{ + Q_OBJECT + +public: + explicit VolumeGroupBaseDialog( QString& vgName, + QVector< const Partition* > pvList, + QWidget* parent = nullptr ); + ~VolumeGroupBaseDialog(); + +protected: + virtual void updateOkButton(); + + void setUsedSizeValue( qint64 usedSize ); + + void setLVQuantity( qint32 lvQuantity ); + + void updateTotalSize(); + + void updateTotalSectors(); + + QVector< const Partition* > checkedItems() const; + + bool isSizeValid() const; + + QString& vgNameValue() const; + + QLineEdit* vgName() const; + + QComboBox* vgType() const; + + QSpinBox* peSize() const; + + QListWidget* pvList() const; + + QPushButton* okButton() const; + +private: + Ui::VolumeGroupBaseDialog* ui; + + QString& m_vgNameValue; + + qint64 m_totalSizeValue; + qint64 m_usedSizeValue; +}; + +#endif // VOLUMEGROUPBASEDIALOG_H diff -Nru calamares-3.2.1/src/modules/partition/gui/VolumeGroupBaseDialog.ui calamares-3.2.2/src/modules/partition/gui/VolumeGroupBaseDialog.ui --- calamares-3.2.1/src/modules/partition/gui/VolumeGroupBaseDialog.ui 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/gui/VolumeGroupBaseDialog.ui 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,206 @@ + + + VolumeGroupBaseDialog + + + + 0 + 0 + 611 + 367 + + + + VolumeGroupDialog + + + + + + List of Physical Volumes + + + + + + + + + + Volume Group Name: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Volume Group Type: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Physical Extent Size: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + MiB + + + 1 + + + 999 + + + 4 + + + + + + + Total Size: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + --- + + + Qt::AlignCenter + + + + + + + Used Size: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + --- + + + Qt::AlignCenter + + + + + + + Total Sectors: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + --- + + + Qt::AlignCenter + + + + + + + Quantity of LVs: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + --- + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + VolumeGroupBaseDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + VolumeGroupBaseDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff -Nru calamares-3.2.1/src/modules/partition/jobs/CreateVolumeGroupJob.cpp calamares-3.2.2/src/modules/partition/jobs/CreateVolumeGroupJob.cpp --- calamares-3.2.1/src/modules/partition/jobs/CreateVolumeGroupJob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/CreateVolumeGroupJob.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,84 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "CreateVolumeGroupJob.h" + +// KPMcore +#include +#include +#include +#include + +CreateVolumeGroupJob::CreateVolumeGroupJob( QString& vgName, QVector< const Partition* > pvList, const qint32 peSize ) + : m_vgName(vgName) + , m_pvList(pvList) + , m_peSize(peSize) +{ + +} + +QString +CreateVolumeGroupJob::prettyName() const +{ + return tr( "Create new volume group named %1." ) + .arg( m_vgName ); +} + +QString +CreateVolumeGroupJob::prettyDescription() const +{ + return tr( "Create new volume group named %1." ) + .arg( m_vgName ); +} + +QString +CreateVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Creating new volume group named %1." ) + .arg( m_vgName ); +} + +Calamares::JobResult +CreateVolumeGroupJob::exec() +{ + Report report( nullptr ); + + CreateVolumeGroupOperation op( m_vgName, m_pvList, m_peSize ); + + op.setStatus( Operation::StatusRunning ); + + QString message = tr( "The installer failed to create a volume group named '%1'.").arg( m_vgName ); + if (op.execute(report)) + return Calamares::JobResult::ok(); + + return Calamares::JobResult::error(message, report.toText()); +} + +void +CreateVolumeGroupJob::updatePreview() +{ + LvmDevice::s_DirtyPVs << m_pvList; +} + +void +CreateVolumeGroupJob::undoPreview() +{ + for ( const auto& pv : m_pvList ) + if ( LvmDevice::s_DirtyPVs.contains( pv )) + LvmDevice::s_DirtyPVs.removeAll( pv ); +} diff -Nru calamares-3.2.1/src/modules/partition/jobs/CreateVolumeGroupJob.h calamares-3.2.2/src/modules/partition/jobs/CreateVolumeGroupJob.h --- calamares-3.2.1/src/modules/partition/jobs/CreateVolumeGroupJob.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/CreateVolumeGroupJob.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,47 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef CREATEVOLUMEGROUPJOB_H +#define CREATEVOLUMEGROUPJOB_H + +#include + +#include + +#include + +class CreateVolumeGroupJob : public Calamares::Job +{ +public: + CreateVolumeGroupJob( QString& vgName, QVector< const Partition* > pvList, const qint32 peSize ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + + void updatePreview(); + void undoPreview(); + +private: + QString m_vgName; + QVector< const Partition* > m_pvList; + qint32 m_peSize; +}; + +#endif // CREATEVOLUMEGROUPJOB_H diff -Nru calamares-3.2.1/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp calamares-3.2.2/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp --- calamares-3.2.1/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/DeactivateVolumeGroupJob.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,69 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "DeactivateVolumeGroupJob.h" + +#include +#include +#include + +DeactivateVolumeGroupJob::DeactivateVolumeGroupJob( LvmDevice* device ) + : m_device( device ) +{ + +} + +QString +DeactivateVolumeGroupJob::prettyName() const +{ + return tr( "Deactivate volume group named %1." ) + .arg( m_device->name() ); +} + +QString +DeactivateVolumeGroupJob::prettyDescription() const +{ + return tr( "Deactivate volume group named %1." ) + .arg( m_device->name() ); +} + +QString +DeactivateVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Deactivate volume group named %1." ) + .arg( m_device->name() ); +} + +Calamares::JobResult +DeactivateVolumeGroupJob::exec() +{ + Report report( nullptr ); + + DeactivateVolumeGroupOperation op( *m_device ); + + op.setStatus( Operation::OperationStatus::StatusRunning ); + + QString message = tr( "The installer failed to deactivate a volume group named %1." ).arg( m_device->name() ); + if ( op.execute( report ) ) + { + op.preview(); + return Calamares::JobResult::ok(); + } + + return Calamares::JobResult::error(message, report.toText()); +} diff -Nru calamares-3.2.1/src/modules/partition/jobs/DeactivateVolumeGroupJob.h calamares-3.2.2/src/modules/partition/jobs/DeactivateVolumeGroupJob.h --- calamares-3.2.1/src/modules/partition/jobs/DeactivateVolumeGroupJob.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/DeactivateVolumeGroupJob.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef DEACTIVATEVOLUMEGROUPJOB_H +#define DEACTIVATEVOLUMEGROUPJOB_H + +#include "Job.h" + +class LvmDevice; + +class DeactivateVolumeGroupJob : public Calamares::Job +{ +public: + DeactivateVolumeGroupJob( LvmDevice* device ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + +private: + LvmDevice* m_device; +}; + +#endif // DEACTIVATEVOLUMEGROUPJOB_H diff -Nru calamares-3.2.1/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp calamares-3.2.2/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp --- calamares-3.2.1/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/RemoveVolumeGroupJob.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,66 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "RemoveVolumeGroupJob.h" + +#include +#include +#include + +RemoveVolumeGroupJob::RemoveVolumeGroupJob( LvmDevice* device ) + : m_device( device ) +{ + +} + +QString +RemoveVolumeGroupJob::prettyName() const +{ + return tr( "Remove Volume Group named %1." ) + .arg( m_device->name() ); +} + +QString +RemoveVolumeGroupJob::prettyDescription() const +{ + return tr( "Remove Volume Group named %1.") + .arg( m_device->name() ); +} + +QString +RemoveVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Remove Volume Group named %1." ) + .arg( m_device->name() ); +} + +Calamares::JobResult +RemoveVolumeGroupJob::exec() +{ + Report report( nullptr ); + + RemoveVolumeGroupOperation op( *m_device ); + + op.setStatus( Operation::OperationStatus::StatusRunning ); + + QString message = tr( "The installer failed to remove a volume group named '%1'." ).arg( m_device->name() ); + if ( op.execute( report ) ) + return Calamares::JobResult::ok(); + + return Calamares::JobResult::error(message, report.toText()); +} diff -Nru calamares-3.2.1/src/modules/partition/jobs/RemoveVolumeGroupJob.h calamares-3.2.2/src/modules/partition/jobs/RemoveVolumeGroupJob.h --- calamares-3.2.1/src/modules/partition/jobs/RemoveVolumeGroupJob.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/RemoveVolumeGroupJob.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,40 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef REMOVEVOLUMEGROUPJOB_H +#define REMOVEVOLUMEGROUPJOB_H + +#include + +class LvmDevice; + +class RemoveVolumeGroupJob : public Calamares::Job +{ +public: + RemoveVolumeGroupJob( LvmDevice* device ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + +private: + LvmDevice* m_device; +}; + +#endif // REMOVEVOLUMEGROUPJOB_H diff -Nru calamares-3.2.1/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp calamares-3.2.2/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp --- calamares-3.2.1/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/ResizeVolumeGroupJob.cpp 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,101 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "ResizeVolumeGroupJob.h" + +// KPMcore +#include +#include +#include +#include + +ResizeVolumeGroupJob::ResizeVolumeGroupJob( LvmDevice* device, QVector< const Partition* >& partitionList ) + : m_device( device ) + , m_partitionList( partitionList ) +{ + +} + +QString +ResizeVolumeGroupJob::prettyName() const +{ + return tr( "Resize volume group named %1 from %2 to %3." ) + .arg( m_device->name() ) + .arg( currentPartitions() ) + .arg( targetPartitions() ); +} + +QString +ResizeVolumeGroupJob::prettyDescription() const +{ + return tr( "Resize volume group named %1 from %2 to %3." ) + .arg( m_device->name() ) + .arg( currentPartitions() ) + .arg( targetPartitions() ); +} + +QString +ResizeVolumeGroupJob::prettyStatusMessage() const +{ + return tr( "Resize volume group named %1 from %2 to %3." ) + .arg( m_device->name() ) + .arg( currentPartitions() ) + .arg( targetPartitions() ); +} + +Calamares::JobResult +ResizeVolumeGroupJob::exec() +{ + Report report( nullptr ); + + ResizeVolumeGroupOperation op( *m_device, m_partitionList ); + + op.setStatus( Operation::OperationStatus::StatusRunning ); + + QString message = tr( "The installer failed to resize a volume group named '%1'." ).arg( m_device->name() ); + if ( op.execute( report ) ) + return Calamares::JobResult::ok(); + + return Calamares::JobResult::error( message, report.toText() ); +} + +QString +ResizeVolumeGroupJob::currentPartitions() const +{ + QString result; + + for ( const Partition *p : m_device->physicalVolumes() ) + result += p->deviceNode() + ", "; + + result.chop(2); + + return result; +} + +QString +ResizeVolumeGroupJob::targetPartitions() const +{ + QString result; + + for ( const Partition *p : m_partitionList ) + result += p->deviceNode() + ", "; + + result.chop(2); + + return result; +} diff -Nru calamares-3.2.1/src/modules/partition/jobs/ResizeVolumeGroupJob.h calamares-3.2.2/src/modules/partition/jobs/ResizeVolumeGroupJob.h --- calamares-3.2.1/src/modules/partition/jobs/ResizeVolumeGroupJob.h 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/jobs/ResizeVolumeGroupJob.h 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,48 @@ +/* === This file is part of Calamares - === + * + * Copyright 2018, Caio Jordão Carvalho + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef RESIZEVOLUMEGROUPJOB_H +#define RESIZEVOLUMEGROUPJOB_H + +#include + +#include + +class LvmDevice; +class Partition; + +class ResizeVolumeGroupJob : public Calamares::Job +{ +public: + ResizeVolumeGroupJob( LvmDevice* device, QVector< const Partition* >& partitionList ); + + QString prettyName() const override; + QString prettyDescription() const override; + QString prettyStatusMessage() const override; + Calamares::JobResult exec() override; + +private: + QString currentPartitions() const; + QString targetPartitions() const; + +private: + LvmDevice* m_device; + QVector< const Partition* > m_partitionList; +}; + +#endif // RESIZEVOLUMEGROUPJOB_H diff -Nru calamares-3.2.1/src/modules/partition/partition.conf calamares-3.2.2/src/modules/partition/partition.conf --- calamares-3.2.1/src/modules/partition/partition.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/partition/partition.conf 2018-09-04 12:03:59.000000000 +0000 @@ -56,7 +56,7 @@ # Support is offered to system integrators that wish to do so, through the # Calamares bug tracker, as well as in #calamares on Freenode. # For more information on setting up GRUB2 for Calamares with LUKS, see -# https://github.com/calamares/calamares/wiki/LUKS-Deployment +# https://github.com/calamares/calamares/wiki/Deploy-LUKS # # If nothing is specified, LUKS is enabled in automated modes. #enableLuksAutomatedPartitioning: true diff -Nru calamares-3.2.1/src/modules/removeuser/removeuser.conf calamares-3.2.2/src/modules/removeuser/removeuser.conf --- calamares-3.2.1/src/modules/removeuser/removeuser.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/removeuser/removeuser.conf 2018-09-04 12:03:59.000000000 +0000 @@ -1,2 +1,6 @@ +# Removes a single user (with userdel) from the system. +# This is typically used in OEM setups or if the live user +# spills into the target system. --- +# Username in the target system to be removed. username: live diff -Nru calamares-3.2.1/src/modules/services/main.py calamares-3.2.2/src/modules/services/main.py --- calamares-3.2.1/src/modules/services/main.py 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/services/main.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# === This file is part of Calamares - === -# -# Copyright 2014, Philip Müller -# Copyright 2014, Teo Mrnjavac -# Copyright 2017, Alf Gaida -# -# Calamares is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Calamares is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Calamares. If not, see . - -import libcalamares - - -def run(): - """ - Setup systemd services - """ - services = libcalamares.job.configuration['services'] - targets = libcalamares.job.configuration['targets'] - disable = libcalamares.job.configuration['disable'] - - # note that the "systemctl enable" and "systemctl disable" commands used - # here will work in a chroot; in fact, they are the only systemctl commands - # that support that, see: - # http://0pointer.de/blog/projects/changing-roots.html - - # enable services - for svc in services: - ec = libcalamares.utils.target_env_call( - ['systemctl', 'enable', '{}.service'.format(svc['name'])] - ) - - if ec != 0: - if svc['mandatory']: - return ("Cannot enable systemd service {}".format(svc['name']), - "systemctl enable call in chroot returned error code " - "{}".format(ec) - ) - else: - libcalamares.utils.debug( - "Cannot enable systemd service {}".format(svc['name']) - ) - libcalamares.utils.debug( - "systemctl enable call in chroot returned error code " - "{}".format(ec) - ) - - # enable targets - for tgt in targets: - ec = libcalamares.utils.target_env_call( - ['systemctl', 'enable', '{}.target'.format(tgt['name'])] - ) - - if ec != 0: - if tgt['mandatory']: - return ("Cannot enable systemd target {}".format(tgt['name']), - "systemctl enable call in chroot returned error code" - "{}".format(ec) - ) - else: - libcalamares.utils.debug( - "Cannot enable systemd target {}".format(tgt['name']) - ) - libcalamares.utils.debug( - "systemctl enable call in chroot returned error code " - "{}".format(ec) - ) - - for dbl in disable: - ec = libcalamares.utils.target_env_call( - ['systemctl', 'disable', '{}.service'.format(dbl['name'])] - ) - - if ec != 0: - if dbl['mandatory']: - return ("Cannot disable systemd service" - "{}".format(dbl['name']), - "systemctl disable call in chroot returned error code" - "{}".format(ec)) - else: - libcalamares.utils.debug( - "Cannot disable systemd service {}".format(dbl['name']) - ) - libcalamares.utils.debug( - "systemctl disable call in chroot returned error code " - "{}".format(ec) - ) - - return None diff -Nru calamares-3.2.1/src/modules/services/module.desc calamares-3.2.2/src/modules/services/module.desc --- calamares-3.2.1/src/modules/services/module.desc 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/services/module.desc 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ ---- -type: "job" -name: "services" -interface: "python" -requires: [] -script: "main.py" diff -Nru calamares-3.2.1/src/modules/services/services.conf calamares-3.2.2/src/modules/services/services.conf --- calamares-3.2.1/src/modules/services/services.conf 2018-06-25 14:04:26.000000000 +0000 +++ calamares-3.2.2/src/modules/services/services.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ ---- -#systemd services and targets are enabled in this precise order - -services: - - name: "NetworkManager" #name of the service file - mandatory: false #true=> if enabling fails the installer errors out and quits - #false=>if enabling fails print warning to console and continue - - name: "cups" - mandatory: false - -targets: - - name: "graphical" - mandatory: true - -disable: - - name: "pacman-init" - mandatory: false - -# Example to express an empty list: -# disable: [] diff -Nru calamares-3.2.1/src/modules/services-openrc/main.py calamares-3.2.2/src/modules/services-openrc/main.py --- calamares-3.2.1/src/modules/services-openrc/main.py 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/services-openrc/main.py 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# === This file is part of Calamares - === +# +# Copyright 2016, Artoo +# Copyright 2017, Philip Müller +# Copyright 2018, Artoo +# Copyright 2018, Adriaan de Groot +# +# Calamares is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Calamares is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Calamares. If not, see . + +import libcalamares + +from libcalamares.utils import target_env_call, warning +from os.path import exists, join + + +class OpenrcController: + """ + This is the openrc service controller. + All of its state comes from global storage and the job + configuration at initialization time. + """ + + def __init__(self): + self.root = libcalamares.globalstorage.value('rootMountPoint') + + # Translate the entries in the config to the actions passed to rc-config + self.services = dict() + self.services["add"] = libcalamares.job.configuration.get('services', []) + self.services["del"] = libcalamares.job.configuration.get('disable', []) + + self.initdDir = libcalamares.job.configuration['initdDir'] + self.runlevelsDir = libcalamares.job.configuration['runlevelsDir'] + + def update(self, state): + """ + Call rc-update for each service listed + in services for the given @p state. rc-update + is called with @p state as the command as well. + """ + + for svc in self.services.get(state, []): + if isinstance(svc, str): + name = svc + runlevel = "default" + mandatory = False + else: + name = svc["name"] + runlevel = svc.get("runlevel", "default") + mandatory = svc.get("mandatory", False) + + service_path = self.root + self.initdDir + "/" + name + runlevel_path = self.root + self.runlevelsDir + "/" + runlevel + + if exists(service_path): + if exists(runlevel_path): + ec = target_env_call(["rc-update", state, name, runlevel]) + if ec != 0: + if mandatory: + return ("Cannot {} service {} to {}".format(state, name, runlevel), + "rc-update {} call in chroot returned error code {}".format(state, ec) + ) + else: + warning("Could not {} service {} in {}, error {!s}".format(state, name, runlevel, ec)) + else: + if mandatory: + return ("Target runlevel {} does not exist for {}.".format(runlevel, name), + "No {} found.".format(runlevel_path)) + else: + warning("Target runlevel {} does not exist for {}.".format(runlevel, name)) + else: + if mandatory: + return ("Target service {} does not exist.".format(name), + "No {} found.".format(service_path)) + else: + warning("Target service {} does not exist in {}.".format(name, self.initdDir)) + + + def run(self): + """Run the controller + """ + + for state in ("add", "del"): + r = self.update(state) + if r is not None: + return r + +def run(): + """ + Setup services + """ + + return OpenrcController().run() diff -Nru calamares-3.2.1/src/modules/services-openrc/module.desc calamares-3.2.2/src/modules/services-openrc/module.desc --- calamares-3.2.1/src/modules/services-openrc/module.desc 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/services-openrc/module.desc 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,5 @@ +--- +type: "job" +name: "services-openrc" +interface: "python" +script: "main.py" diff -Nru calamares-3.2.1/src/modules/services-openrc/services-openrc.conf calamares-3.2.2/src/modules/services-openrc/services-openrc.conf --- calamares-3.2.1/src/modules/services-openrc/services-openrc.conf 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/services-openrc/services-openrc.conf 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,46 @@ +# openrc services module to modify service runlevels via rc-update in the chroot +# +# Services can be added (to any runlevel, or multiple runlevels) or deleted. +# Handle del with care and only use it if absolutely necessary. +# +# if a service is listed in the conf but is not present/detected on the target system, +# or a runlevel does not exist, it will be ignored and skipped; a warning is logged. +# +--- +# initdDir: holds the openrc service directory location +initdDir: /etc/init.d + +# runlevelsDir: holds the runlevels directory location +runlevelsDir: /etc/runlevels + +# services: a list of entries to **enable** +# disable: a list of entries to **disable** +# +# Each entry has three fields: +# - name: the service name +# - (optional) runlevel: can hold any runlevel present on the target +# system; if no runlevel is provided, "default" is assumed. +# - (optional) mandatory: if set to true, a failure to modify +# the service will result in installation failure, rather than just +# a warning. The default is false. +# +# an entry may also be a single string, which is interpreted +# as the name field (runlevel "default" is assumed then, and not-mandatory). +# +# # Example services and disable settings: +# # - add foo1 to default, but it must succeed +# # - add foo2 to nonetwork +# # - remove foo3 from default +# # - remove foo4 from default +# services: +# - name: foo1 +# mandatory: true +# - name: foo2 +# runlevel: nonetwork +# disable: +# - name: foo3 +# runlevel: default +# - foo4 +services: [] +disable: [] + diff -Nru calamares-3.2.1/src/modules/services-systemd/main.py calamares-3.2.2/src/modules/services-systemd/main.py --- calamares-3.2.1/src/modules/services-systemd/main.py 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/services-systemd/main.py 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# === This file is part of Calamares - === +# +# Copyright 2014, Philip Müller +# Copyright 2014, Teo Mrnjavac +# Copyright 2017, Alf Gaida +# Copyright 2018, Adriaan de Groot +# +# Calamares is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Calamares is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Calamares. If not, see . + +import libcalamares + + +def systemctl(targets, command, suffix): + """ + For each entry in @p targets, run "systemctl ", + where is the entry's name plus the given @p suffix. + (No dot is added between name and suffix; suffix may be empty) + + Returns a failure message, or None if this was successful. + Services that are not mandatory have their failures suppressed + silently. + """ + for svc in targets: + if isinstance(svc, str): + name = svc + mandatory = False + else: + name = svc["name"] + mandatory = svc.get("mandatory", False) + + ec = libcalamares.utils.target_env_call( + ['systemctl', command, "{}{}".format(name, suffix)] + ) + + if ec != 0: + if mandatory: + return ("Cannot {} systemd {} {}".format(command, suffix, name), + "systemctl {} call in chroot returned error code {}".format(command, ec) + ) + else: + libcalamares.utils.warning( + "Cannot {} systemd {} {}".format(command, suffix, name) + ) + libcalamares.utils.warning( + "systemctl {} call in chroot returned error code {}".format(command, ec) + ) + return None + + +def run(): + """ + Setup systemd services + """ + cfg = libcalamares.job.configuration + + # note that the "systemctl enable" and "systemctl disable" commands used + # here will work in a chroot; in fact, they are the only systemctl commands + # that support that, see: + # http://0pointer.de/blog/projects/changing-roots.html + + r = systemctl(cfg.get("services", []), "enable", ".service") + if r is not None: + return r + + r = systemctl(cfg.get("targets", []), "enable", ".target") + if r is not None: + return r + + r = systemctl(cfg.get("disable", []), "disable", ".service") + if r is not None: + return r + + r = systemctl(cfg.get("disable-targets", []), "disable", ".target") + if r is not None: + return r + + r = systemctl(cfg.get("mask", []), "mask", "") + if r is not None: + return r + + + # This could have just been return r + return None diff -Nru calamares-3.2.1/src/modules/services-systemd/module.desc calamares-3.2.2/src/modules/services-systemd/module.desc --- calamares-3.2.1/src/modules/services-systemd/module.desc 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/services-systemd/module.desc 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,6 @@ +--- +type: "job" +name: "services-systemd" +interface: "python" +requires: [] +script: "main.py" diff -Nru calamares-3.2.1/src/modules/services-systemd/services-systemd.conf calamares-3.2.2/src/modules/services-systemd/services-systemd.conf --- calamares-3.2.1/src/modules/services-systemd/services-systemd.conf 1970-01-01 00:00:00.000000000 +0000 +++ calamares-3.2.2/src/modules/services-systemd/services-systemd.conf 2018-09-04 12:03:59.000000000 +0000 @@ -0,0 +1,70 @@ +# Systemd services manipulation. +# +# This module can enable services and targets for systemd +# (if packaging doesn't already do that). It can calso +# disable services (but not targets). +# +# First, services are enabled; then targets; then services +# are disabled -- this order of operations is fixed. +--- + +# There are three configuration keys for this module: +# *services*, *targets* and *disable*. The value of each +# key is a list of entries. Each entry has two keys: +# - *name* is the (string) name of the service or target that is being +# changed. Use quotes. Don't include ".target" or ".service" +# in the name. +# - *mandatory* is a boolean option, which states whether the change +# must be done successfully. If systemd reports an error while changing +# a mandatory entry, the installation will fail. When mandatory is false, +# errors for that entry (service or target) are ignored. If mandatory +# is not specified, the default is false. +# +# An entry may also be given as a single string, which is then +# interpreted as the name of the service. In this case, mandatory +# is also set to the default of false. +# +# Use [] to express an empty list. + +# # This example enables NetworkManager (and fails if it can't), +# # disables cups (and ignores failure). Then it enables the +# # graphical target (e.g. so that SDDM runs for login), and +# # finally disables pacman-init (an ArchLinux-only service). +# # +# # Enables .service +# services: +# - name: "NetworkManager" +# mandatory: true +# - name: "cups" +# mandatory: false +# +# # Enables .target +# targets: +# - name: "graphical" +# mandatory: true +# +# # Disables .service +# disable: +# - name: "pacman-init" +# mandatory: false +# +# # Disables .target +# # .. this shows how to use just the name +# disable-targets: +# - graphical +# +# # Masks (stronger version of disable). This section +# # is unusual because you **must** include the suffix +# # (e.g. ".service") as part of the name, so, e.g. to mask +# # NetworkManager (rather than just disable it) you must +# # specify "NetworkManager.service" as name. +# mask: +# - name: "NetworkManager.service" +# - mandatory: true + +# By default, no changes are made. +services: [] +targets: [] +disable: [] +disable-targets: [] +mask: []