This commit is contained in:
Valeria Fadeeva 2024-07-19 22:08:51 +05:00
commit fb30280819
148 changed files with 17375 additions and 0 deletions

View File

@ -0,0 +1,8 @@
/* Allow Calamares to be started without password authentication
*/
polkit.addRule(function(action, subject) {
if ((action.id == "com.github.calamares.calamares.pkexec.run"))
{
return polkit.Result.YES;
}
});

765
CMakeLists.txt Normal file
View File

@ -0,0 +1,765 @@
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2017 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
#
###
#
# Calamares is Free Software: see the License-Identifier above.
#
# Individual files may have different licenses (like the CMake
# infrastructure, which is BSD-2-Clause licensed). Check the SPDX
# identifiers in each file.
#
###
#
# Generally, this CMakeLists.txt will find all the dependencies for Calamares
# and complain appropriately. See below (later in this file) for CMake-level
# options. There are some "secret" options as well:
#
# SKIP_MODULES : a space or semicolon-separated list of directory names
# under src/modules that should not be built.
# USE_<foo> : fills in SKIP_MODULES for modules called <foo>-<something>.
# WITH_<foo> : try to enable <foo> (these usually default to ON). For
# a list of WITH_<foo> grep CMakeCache.txt after running
# CMake once. These affect the ABI offered by Calamares.
# - PYBIND11 (use bundled pybind11, default ON, needs WITH_PYTHON)
# - PYTHON (enable Python Job modules, default ON if Python is found)
# - QML (enable QML UI View modules, default ON)
# - QT6 (use Qt6 rather than Qt5, default to OFF)
# The WITH_* options affect the ABI of Calamares: you must
# build (C++) modules for Calamares with the same WITH_*
# settings, or they may not load at all.
# BUILD_<foo> : choose additional things to build
# - APPDATA (use AppData in packagechooser, requires QtXml)
# - APPSTREAM (use AppStream in packagechooser, requires libappstream-qt)
# - BUILD_CRASH_REPORTING (uses KCrash, rather than Calamares internal, for crash reporting)
# - SCHEMA_TESTING (requires Python, see ci/configvalidator.py)
# - TESTING (standard CMake option)
# DEBUG_<foo> : special developer flags for debugging.
#
# Example usage:
#
# cmake . -DSKIP_MODULES="partition luksbootkeycfg"
#
# To obtain the version number of calamares, run CMake in script mode, e.g.
# cmake -P CMakeLists.txt
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
set(CALAMARES_VERSION 3.3.9)
set(CALAMARES_RELEASE_MODE ON) # Set to ON during a release
if(CMAKE_SCRIPT_MODE_FILE)
include(${CMAKE_CURRENT_LIST_DIR}/CMakeModules/ExtendedVersion.cmake)
set(CMAKE_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR})
extend_version( ${CALAMARES_VERSION} ${CALAMARES_RELEASE_MODE} _vshort _vlong )
message("${_vlong}")
return()
endif()
# Massage the version for CMake if there is a version-suffix
string(REGEX REPLACE "-.*" "" CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}")
# And preserve the original version (suffix and all) because project() overwrites
# .. but if we're doing non-release builds, this gets replaced with git versioning.
set(CALAMARES_VERSION_LONG "${CALAMARES_VERSION}")
project(CALAMARES VERSION ${CALAMARES_VERSION_SHORT} LANGUAGES C CXX HOMEPAGE_URL "https://calamares.io/")
if(NOT CALAMARES_RELEASE_MODE AND CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
message(FATAL_ERROR "Do not build development versions in the source-directory.")
endif()
# Calamares in the 3.3 series promises ABI compatbility, so it sets a
# .so-version equal to the series number. We use ci/abicheck.sh to
# keep track of this. Note that the **alpha** releases also have
# such an .so-version, but are not ABI-stable yet.
set(CALAMARES_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}")
### OPTIONS
#
option(INSTALL_POLKIT "Install Polkit configuration" ON)
option(INSTALL_COMPLETION "Install shell completions" OFF)
option(INSTALL_CONFIG "Install configuration files" OFF)
# When adding WITH_* that affects the ABI offered by libcalamares,
# also update libcalamares/CalamaresConfig.h.in
option(WITH_PYBIND11 "Use bundled pybind11 instead of Boost::Python" ON)
option(WITH_PYTHON "Enable Python modules API." ON)
option(WITH_QML "Enable QML UI options." ON)
option(WITH_QT6 "Use Qt6 instead of Qt5" OFF)
#
# Additional parts to build that do not affect ABI
option(BUILD_SCHEMA_TESTING "Enable schema-validation-tests" ON)
# Options for the calamares executable
option(BUILD_CRASH_REPORTING "Enable crash reporting with KCrash." ON)
# Possible debugging flags are:
# - DEBUG_TIMEZONES draws latitude and longitude lines on the timezone
# widget and enables chatty debug logging, for dealing with the timezone
# location database.
# - DEBUG_FILESYSTEMS does extra logging and checking when looking at
# partition configuration. Lists known KPMCore FS types.
# - DEBUG_PARTITION_UNSAFE (see partition/CMakeLists.txt)
# - DEBUG_PARTITION_BAIL_OUT (see partition/CMakeLists.txt)
### USE_*
#
# By convention, when there are multiple modules that implement similar
# functionality, and it only makes sense to have **at most one** of them
# enabled at any time, those modules are named <foo>-<implementation>.
# 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 <foo>, set USE_<foo> to the
# name of the implementation. If USE_<foo> is unset, or empty, then
# all the implementations are enabled (this just means they are
# **available** to `settings.conf`, not that they are used).
#
# To explicitly disable a set of modules, set USE_<foo>=none
# (e.g. the literal string none), which won't match any of the
# modules but is handled specially.
#
# The following USE_* functionalities are available:
# - *services* picks one of the two service-configuration modules,
# for either systemd or openrc. This defaults to empty so that
# **both** modules are available.
set(USE_services "" CACHE STRING "Select the services module to use")
### Calamares application info
#
set(CALAMARES_ORGANIZATION_NAME "Calamares")
set(CALAMARES_ORGANIZATION_DOMAIN "github.com/calamares")
set(CALAMARES_APPLICATION_NAME "Calamares")
set(CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framework")
### Transifex (languages) info
#
# complete = 100% translated,
# good = nearly complete (use own judgement, right now >= 75%)
# ok = incomplete (more than 25% untranslated, at least 5% translated),
# incomplete = <5% translated, placeholder in tx; these are not included.
#
# Language en (source language) is added later. It isn't listed in
# Transifex either. Get the list of languages and their status
# from https://app.transifex.com/calamares/calamares/ , or (preferably)
# use ci/txstats.py to automatically check.
#
# When adding a new language, take care that it is properly loaded
# by the translation framework. Languages with alternate scripts
# (sr@latin in particular) or location (ca@valencia) need special
# handling in libcalamares/locale/Translation.h .
#
# NOTE: move ie (Interlingue) to _ok once Qt supports it.
# NOTE: update these lines by running `txstats.py`, or for full automation
# `txstats.py -e`. See also
#
# Total 80 languages
set( _tx_complete de en es_AR fi_FI hr hu ja lt tr_TR uk zh_TW )
set( _tx_good az az_AZ be bg ca cs_CZ es fr fur he hi is it_IT ko
pl pt_BR pt_PT ru si sq sv zh_CN )
set( _tx_ok ar as ast bn ca@valencia da el en_GB eo es_MX et eu fa
gl id ka ml mr nb nl oc ro sk sl sr sr@latin tg th vi )
set( _tx_incomplete bqi es_PR gu ie ja-Hira kk kn lo lv mk ne_NP
ro_RO ta_IN te ur uz zh zh_HK )
# Total 80 languages
### Required versions
#
# See DEPENDENCIES section below.
# The default build is with Qt5, but that is increasingly not the
# version installed-by-default on Linux systems. Upgrade the default
# if Qt5 isn't available but Qt6 is. This also saves messing around
# with special CMake flags for every script (e.g. ci/RELEASE.sh and
# ci/abicheck.sh).
if(NOT WITH_QT6)
find_package(Qt5Core QUIET)
if (NOT TARGET Qt5::Core)
find_package(Qt6Core QUIET)
if (TARGET Qt6::Core)
message(STATUS "Default Qt version (Qt5) not found, upgrading build to Qt6")
set(WITH_QT6 ON)
endif()
endif()
endif()
if(WITH_QT6)
message(STATUS "Building Calamares with Qt6")
set(qtname "Qt6")
set(kfname "KF6")
set(QT_VERSION 6.5.0)
set(ECM_VERSION 5.240)
set(KF_VERSION 5.240) # KDE Neon weirdness
# API that was deprecated before Qt 5.15 causes a compile error
add_compile_definitions(QT_DISABLE_DEPRECATED_BEFORE=0x060400)
# Something to add to filenames for this specific Qt version
set(QT_VERSION_SUFFIX "-qt6")
else()
message(STATUS "Building Calamares with Qt5")
set(qtname "Qt5")
set(kfname "KF5")
set(QT_VERSION 5.15.0)
set(ECM_VERSION 5.78)
set(KF_VERSION 5.78)
# API that was deprecated before Qt 5.15 causes a compile error
add_compile_definitions(QT_DISABLE_DEPRECATED_BEFORE=0x050f00)
# Something to add to filenames for this specific Qt version
set(QT_VERSION_SUFFIX "")
endif()
set(BOOSTPYTHON_VERSION 1.72.0)
set(PYTHONLIBS_VERSION 3.6)
set(YAMLCPP_VERSION 0.5.1)
### CMAKE SETUP
#
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules")
# Enable IN_LIST
if(POLICY CMP0057)
cmake_policy(SET CMP0057 NEW)
endif()
# Let ``AUTOMOC`` and ``AUTOUIC`` process ``GENERATED`` files.
if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif()
# Recognize more macros to trigger automoc
if(NOT CMAKE_VERSION VERSION_LESS "3.10.0")
list(
APPEND
CMAKE_AUTOMOC_MACRO_NAMES
"K_PLUGIN_FACTORY_WITH_JSON"
"K_EXPORT_PLASMA_DATAENGINE_WITH_JSON"
"K_EXPORT_PLASMA_RUNNER"
)
endif()
# CMake Modules
include(CMakePackageConfigHelpers)
include(CTest)
include(FeatureSummary)
# Calamares Modules
include(CMakeColors)
### C++ SETUP
#
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror=return-type")
set(CMAKE_CXX_FLAGS_DEBUG "-Og -g ${CMAKE_CXX_FLAGS_DEBUG}")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS_DEBUG "-Og -g")
set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined -Wl,--fatal-warnings ${CMAKE_SHARED_LINKER_FLAGS}")
# If no build type is set, pick a reasonable one
if(NOT CMAKE_BUILD_TYPE)
if(CALAMARES_RELEASE_MODE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
else()
set(CMAKE_BUILD_TYPE "Debug")
endif()
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
message(STATUS "Found Clang ${CMAKE_CXX_COMPILER_VERSION}, setting up Clang-specific compiler flags.")
# Clang warnings: doing *everything* is counter-productive, since it warns
# about things which we can't fix (e.g. C++98 incompatibilities, but
# Calamares is C++17).
foreach(
CLANG_WARNINGS
-Weverything
-Wno-c++98-compat
-Wno-c++98-compat-pedantic
-Wno-padded
-Wno-undefined-reinterpret-cast
-Wno-global-constructors
-Wno-exit-time-destructors
-Wno-missing-prototypes
-Wno-documentation-unknown-command
-Wno-unknown-warning-option
)
string(APPEND CMAKE_CXX_FLAGS " ${CLANG_WARNINGS}")
endforeach()
# The dwarf-debugging flags are slightly different, too
string(APPEND CMAKE_CXX_FLAGS_DEBUG " -gdwarf")
string(APPEND CMAKE_C_FLAGS_DEBUG " -gdwarf")
# Third-party code where we don't care so much about compiler warnings
# (because it's uncomfortable to patch) get different flags; use
# mark_thirdparty_code( <file> [<file>...] )
# to switch off warnings for those sources.
set(SUPPRESS_3RDPARTY_WARNINGS "-Wno-everything")
set(CMAKE_TOOLCHAIN_PREFIX "llvm-")
# The path prefix is only relevant for CMake 3.16 and later, fixes #1286
set(CMAKE_AUTOMOC_PATH_PREFIX OFF)
set(CALAMARES_AUTOMOC_OPTIONS "-butils/moc-warnings.h")
set(CALAMARES_AUTOUIC_OPTIONS --include utils/moc-warnings.h)
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Woverloaded-virtual")
set(SUPPRESS_3RDPARTY_WARNINGS "")
endif()
# Use mark_thirdparty_code() to reduce warnings from the compiler
# on code that we're not going to fix. Call this with a list of files.
macro(mark_thirdparty_code)
set_source_files_properties(
${ARGV}
PROPERTIES COMPILE_FLAGS "${SUPPRESS_3RDPARTY_WARNINGS}" COMPILE_DEFINITIONS "THIRDPARTY"
)
endmacro()
if(CMAKE_COMPILER_IS_GNUCXX)
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9)
message(STATUS "Found GNU g++ ${CMAKE_CXX_COMPILER_VERSION}, enabling colorized error messages.")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=auto")
endif()
endif()
### DEPENDENCIES
#
find_package(${qtname} ${QT_VERSION} CONFIG REQUIRED Concurrent Core DBus Gui LinguistTools Network Svg Widgets)
if(WITH_QML)
find_package(${qtname} ${QT_VERSION} CONFIG REQUIRED Quick QuickWidgets)
endif()
# Note that some modules need more Qt modules, optionally.
find_package(YAMLCPP ${YAMLCPP_VERSION})
set_package_properties(
YAMLCPP
PROPERTIES
TYPE REQUIRED
DESCRIPTION "YAML parser for C++"
PURPOSE "Parsing of configuration files"
)
find_package(Polkit${qtname}-1)
if(INSTALL_POLKIT)
set_package_properties(
Polkit${qtname}-1
PROPERTIES
TYPE REQUIRED
)
endif()
set_package_properties(
Polkit${qtname}-1
PROPERTIES
DESCRIPTION "${qtname} support for Polkit"
URL "https://cgit.kde.org/polkit-qt-1.git"
PURPOSE "Polkit${qtname}-1 helps with installing Polkit configuration"
)
# Find ECM once, and add it to the module search path; Calamares
# modules that need ECM can do
# if(ECM_FOUND)
# no need to mess with the module path after.
find_package(ECM ${ECM_VERSION} NO_MODULE)
if(ECM_FOUND)
message(STATUS "Found KDE ECM ${ECM_MODULE_PATH}")
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH})
if(BUILD_TESTING)
# ECM implies that we can build the tests, too
find_package(${qtname} COMPONENTS Test REQUIRED)
include(ECMAddTests)
endif()
include(KDEInstallDirs)
endif()
find_package(${kfname}CoreAddons ${KF_VERSION} QUIET)
set_package_properties(
${kfname}CoreAddons
PROPERTIES
TYPE REQUIRED
DESCRIPTION "KDE Framework CoreAddons"
URL "https://api.kde.org/frameworks/"
PURPOSE "Essential Framework for AboutData and Macros"
)
# After this point, there should be no REQUIRED find_packages,
# since we want tidy reporting of optional dependencies.
feature_summary(
WHAT REQUIRED_PACKAGES_NOT_FOUND
FATAL_ON_MISSING_REQUIRED_PACKAGES
DESCRIPTION "The following REQUIRED packages were not found:"
QUIET_ON_EMPTY
)
#
# OPTIONAL DEPENDENCIES
#
# First, set KF back to optional so that any missing components don't trip us up.
find_package(${kfname}Crash ${KF_VERSION} QUIET)
set_package_properties(
${kfname}Crash
PROPERTIES
TYPE OPTIONAL
DESCRIPTION "KDE Framework Crash"
URL "https://api.kde.org/frameworks/"
PURPOSE "Framework for sending Crash Dumps"
)
if(NOT TARGET ${kfname}::Crash)
if(BUILD_CRASH_REPORTING)
message(WARNING "BUILD_CRASH_REPORTING is set, but ${kfname}::Crash is not available.")
endif()
set(BUILD_CRASH_REPORTING OFF)
endif()
find_package(Python ${PYTHONLIBS_VERSION} COMPONENTS Interpreter Development)
set_package_properties(
Python
PROPERTIES
DESCRIPTION "Python3 interpreter."
URL "https://python.org"
PURPOSE "Python3 interpreter for certain tests."
)
set(_schema_explanation "")
if(Python_Interpreter_FOUND)
if(BUILD_SCHEMA_TESTING)
# The configuration validator script has some dependencies,
# and if they are not installed, don't run. If errors out
# with exit(1) on missing dependencies.
if(CALAMARES_CONFIGVALIDATOR_CHECKED)
message(STATUS "Using cached config-validation result")
set(_validator_deps ${CALAMARES_CONFIGVALIDATOR_RESULT})
else()
execute_process(
COMMAND ${Python_EXECUTABLE} "${CMAKE_SOURCE_DIR}/ci/configvalidator.py" -x
RESULT_VARIABLE _validator_deps
)
set(CALAMARES_CONFIGVALIDATOR_CHECKED TRUE CACHE INTERNAL "Dependencies for configvalidator checked")
set(CALAMARES_CONFIGVALIDATOR_RESULT ${_validator_deps}
CACHE INTERNAL "Result of configvalidator dependency check"
)
endif()
# It should never succeed, but only returns 1 when the imports fail
if(_validator_deps EQUAL 1)
message(STATUS "Checked for config-validation dependencies: NOT-FOUND")
set(_schema_explanation " Missing dependencies for configvalidator.py.")
set(BUILD_SCHEMA_TESTING OFF)
else()
message(STATUS "Checked for config-validation dependencies: found")
endif()
else()
set(CALAMARES_CONFIGVALIDATOR_CHECKED OFF CACHE INTERNAL "Dependencies for configvalidator checked")
endif()
else()
# Can't run schema tests without Python3.
set(_schema_explanation " Missing Python3.")
set(BUILD_SCHEMA_TESTING OFF)
set(CALAMARES_CONFIGVALIDATOR_CHECKED OFF CACHE INTERNAL "Dependencies for configvalidator checked")
endif()
add_feature_info(yaml-schema BUILD_SCHEMA_TESTING "Validate YAML (config files) with schema.${_schema_explanation}")
if(NOT Python_Development_FOUND)
message(STATUS "Disabling Python modules")
set(WITH_PYTHON OFF)
set(WITH_PYBIND11 OFF)
set(WITH_BOOST_PYTHON OFF)
endif()
if(WITH_PYTHON AND NOT WITH_PYBIND11)
set(WITH_BOOST_PYTHON ON)
find_package(boost_python)
if(NOT TARGET Boost::python)
find_package(Boost ${BOOSTPYTHON_VERSION} COMPONENTS python)
set_package_properties(Boost PROPERTIES
PURPOSE "Boost.Python is used for Python job modules (because WITH_PYBIND11 is OFF)."
TYPE REQUIRED
)
else()
message(STATUS "Found boost_python with target Boost::python")
set(Boost_FOUND ON)
endif()
endif()
add_feature_info(python WITH_PYTHON "Enable Python-modules")
add_feature_info(python-pybind11 WITH_PYBIND11 "Python-modules through pybind11")
add_feature_info(python-boost WITH_BOOST_PYTHON "Python-modules through Boost::Python")
# Now we know the state of the ABI-options, copy them into "Calamares_"
# prefixed variables, to match how the variables would-be-named
# when building out-of-tree.
set(Calamares_WITH_PYTHON ${WITH_PYTHON})
set(Calamares_WITH_PYBIND11 ${WITH_PYBIND11})
set(Calamares_WITH_BOOST_PYTHON ${WITH_BOOST_PYTHON})
set(Calamares_WITH_QML ${WITH_QML})
set(Calamares_WITH_QT6 ${WITH_QT6})
### Transifex Translation status
#
# Construct language lists for use. This massages the language lists if
# needed and checks for some obvious errors. The actual work of
# compiling translations is done in the lang/ directory.
#
set(curr_tx ${_tx_complete} ${_tx_good} ${_tx_ok} ${_tx_incomplete})
set(tx_errors OFF)
if(curr_tx)
# New in list
foreach(l ${curr_tx})
set(p_l "lang/calamares_${l}.ts")
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${p_l})
message(WARNING "Language ${l} has no .ts file yet.")
set(tx_errors ON)
endif()
endforeach()
unset(p_l)
unset(l)
endif()
unset(curr_tx)
if(tx_errors)
message(FATAL_ERROR "Translation warnings, see above.")
endif()
set(CALAMARES_TRANSLATION_LANGUAGES en ${_tx_complete} ${_tx_good} ${_tx_ok})
if(NOT CALAMARES_RELEASE_MODE)
# Outside of release mode, enable all the languages
list(APPEND CALAMARES_TRANSLATION_LANGUAGES ${_tx_incomplete})
endif()
list(SORT CALAMARES_TRANSLATION_LANGUAGES)
list(REMOVE_DUPLICATES CALAMARES_TRANSLATION_LANGUAGES)
add_subdirectory(lang) # i18n tools
### Example Distro
#
# For testing purposes Calamares includes a very, very, limited sample
# distro called "Generic". The root filesystem of "Generic" lives in
# data/example-root and can be squashed up as part of the build, so
# that a pure-upstream run of ./calamares -d from the build directory
# (with all the default settings and configurations) can actually
# do an complete example run.
#
# Some binaries from the build host (e.g. /bin and /lib) are also
# squashed into the example filesystem.
#
# To build the example distro (for use by the default, example,
# unsquashfs module), build the target 'example-distro', eg.:
#
# make example-distro
#
find_program(mksquashfs_PROGRAM mksquashfs)
if(mksquashfs_PROGRAM)
set(mksquashfs_FOUND ON)
set(src_fs ${CMAKE_SOURCE_DIR}/data/example-root/)
set(dst_fs ${CMAKE_BINARY_DIR}/example.sqfs)
if(EXISTS ${src_fs})
# based on the build host. If /lib64 exists, assume it is needed.
# Collect directories needed for a minimal binary distro,
# Note that the last path component is added to the root, so
# if you add /usr/sbin here, it will be put into /sbin_1.
# Add such paths to /etc/profile under ${src_fs}.
set(candidate_fs /sbin /bin /lib /lib64)
set(host_fs "")
foreach(c_fs ${candidate_fs})
if(EXISTS ${c_fs})
list(APPEND host_fs ${c_fs})
endif()
endforeach()
add_custom_command(
OUTPUT ${dst_fs}
COMMAND ${mksquashfs_PROGRAM} ${src_fs} ${dst_fs} -all-root
COMMAND ${mksquashfs_PROGRAM} ${host_fs} ${dst_fs} -all-root
)
add_custom_target(example-distro DEPENDS ${dst_fs})
endif()
else()
set(mksquashfs_FOUND OFF)
endif()
# Doesn't list mksquashfs as an optional dep, though, because it
# hasn't been sent through the find_package() scheme.
#
# "http://tldp.org/HOWTO/SquashFS-HOWTO/creatingandusing.html"
add_feature_info(ExampleDistro ${mksquashfs_FOUND} "Create example-distro target.")
### CALAMARES PROPER
#
# Additional info for non-release builds. The "extended" version information
# with date and git information (commit, dirty status) is used only
# by CalamaresVersionX.h, which is included by consumers that need a full
# version number with all that information; normal consumers can include
# CalamaresVersion.h with more stable numbers.
if(NOT CALAMARES_RELEASE_MODE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/")
include(ExtendedVersion)
extend_version( "${CALAMARES_VERSION}" OFF CALAMARES_VERSION_SHORT CALAMARES_VERSION_LONG )
endif()
# Special define for RC (e.g. not-a-release) builds.
# This is consumed via the CalamaresConfig.h header.
if(NOT CALAMARES_RELEASE_MODE)
set(CALAMARES_VERSION_RC 1)
endif()
# enforce using constBegin, constEnd for const-iterators
add_definitions(-DQT_STRICT_ITERATORS -DQT_SHARED -DQT_SHAREDPOINTER_TRACK_POINTERS)
# set paths
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
# Better default installation paths: GNUInstallDirs defines
# CMAKE_INSTALL_FULL_SYSCONFDIR to be CMAKE_INSTALL_PREFIX/etc by default
# but we really want /etc
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
set(CMAKE_INSTALL_SYSCONFDIR "/etc")
endif()
# make predefined install dirs available everywhere
include(GNUInstallDirs)
# This is used by CalamaresAddLibrary; once Calamares is installed,
# the CalamaresConfig.cmake module sets this variable to the IMPORTED
# libraries for Calamares.
set(Calamares_LIBRARIES calamares)
add_subdirectory(3rdparty/kdsingleapplication)
if(WITH_PYBIND11)
add_subdirectory(3rdparty/pybind11)
endif()
add_subdirectory(src)
add_feature_info(Python ${WITH_PYTHON} "Python job modules")
add_feature_info(Pybind11 ${WITH_PYBIND11} "Python using bundled pybind11")
add_feature_info(Qml ${WITH_QML} "QML UI support")
add_feature_info(Polkit ${INSTALL_POLKIT} "Install Polkit files")
add_feature_info(KCrash ${BUILD_CRASH_REPORTING} "Crash dumps via KCrash")
### Post-source configuration
#
#
find_package(${kfname} ${KF_VERSION} QUIET COMPONENTS CoreAddons)
### CMake infrastructure installation
#
#
set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/Calamares" CACHE PATH "Installation directory for CMake files")
set(CMAKE_INSTALL_FULL_CMAKEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}")
export(PACKAGE Calamares)
configure_package_config_file(
"CalamaresConfig.cmake.in"
"${PROJECT_BINARY_DIR}/CalamaresConfig.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_DATADIR
)
write_basic_package_version_file(
${PROJECT_BINARY_DIR}/CalamaresConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
install(EXPORT Calamares DESTINATION "${CMAKE_INSTALL_CMAKEDIR}" FILE "CalamaresTargets.cmake" NAMESPACE Calamares::)
# Install the cmake files
install(
FILES
"${PROJECT_BINARY_DIR}/CalamaresConfig.cmake"
"${PROJECT_BINARY_DIR}/CalamaresConfigVersion.cmake"
"CMakeModules/CalamaresAddBrandingSubdirectory.cmake"
"CMakeModules/CalamaresAddLibrary.cmake"
"CMakeModules/CalamaresAddModuleSubdirectory.cmake"
"CMakeModules/CalamaresAddPlugin.cmake"
"CMakeModules/CalamaresAddTest.cmake"
"CMakeModules/CalamaresAddTranslations.cmake"
"CMakeModules/CalamaresAutomoc.cmake"
"CMakeModules/CalamaresCheckModuleSelection.cmake"
"CMakeModules/CMakeColors.cmake"
"CMakeModules/FindYAMLCPP.cmake"
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
)
### Miscellaneous installs
#
#
if(INSTALL_POLKIT)
install(FILES com.github.calamares.calamares.policy DESTINATION "${POLKITQT-1_POLICY_FILES_INSTALL_DIR}")
endif()
if(INSTALL_COMPLETION)
if(NOT CMAKE_INSTALL_BASHCOMPLETIONDIR)
set(CMAKE_INSTALL_BASHCOMPLETIONDIR "${CMAKE_INSTALL_DATADIR}/bash-completion/completions")
endif()
install(FILES ${CMAKE_SOURCE_DIR}/data/completion/bash/calamares DESTINATION "${CMAKE_INSTALL_BASHCOMPLETIONDIR}")
endif()
install(FILES calamares.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES man/calamares.8 DESTINATION ${CMAKE_INSTALL_MANDIR}/man8/)
if(INSTALL_CONFIG)
install(FILES settings.conf DESTINATION share/calamares)
endif()
### Uninstall
#
#
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE
@ONLY
)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
### Developer convenience
#
# The module support files -- .desc files, .conf files -- are copied into the build
# directory so that it is possible to run `calamares -d` from there. Copy the
# top-level settings.conf as well, into the build directory.
if( settings.conf IS_NEWER_THAN ${CMAKE_BINARY_DIR}/settings.conf )
configure_file(settings.conf ${CMAKE_BINARY_DIR}/settings.conf COPYONLY)
endif()
### CMAKE SUMMARY REPORT
#
get_directory_property(SKIPPED_MODULES DIRECTORY src/modules DEFINITION LIST_SKIPPED_MODULES)
calamares_explain_skipped_modules( ${SKIPPED_MODULES} )
feature_summary(WHAT ENABLED_FEATURES DESCRIPTION "The following features are enabled" QUIET_ON_EMPTY)
feature_summary(WHAT DISABLED_FEATURES DESCRIPTION "The following features have been disabled:" QUIET_ON_EMPTY)
feature_summary(
WHAT OPTIONAL_PACKAGES_NOT_FOUND
DESCRIPTION "The following OPTIONAL packages were not found:"
QUIET_ON_EMPTY
)
feature_summary(
WHAT REQUIRED_PACKAGES_NOT_FOUND
FATAL_ON_MISSING_REQUIRED_PACKAGES
DESCRIPTION "The following REQUIRED packages were not found:"
QUIET_ON_EMPTY
)
### PACKAGING
#
# Note: most distro's will do distro-specific packaging rather than
# using CPack, and this duplicates information in the AppStream, too.
set(CPACK_PACKAGE_VENDOR calamares)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A Linux system installer")
set(CPACK_PACKAGE_DESCRIPTION
"Calamares is a Linux system installer, intended for Linux distributions to use on their ISOs and other bootable media to install the distribution to the end-user's computer. Calamares can also be used as an OEM configuration tool. It is modular, extensible and highly-configurable for Linux distributions from all five major Linux families."
)
set(CPACK_PACKAGE_ICON "data/images/squid.png")
include(CPack)

70
README.md Normal file
View File

@ -0,0 +1,70 @@
# Melawy Linux fork of Calamares Installer Framework
[![Maintenance](https://img.shields.io/maintenance/yes/2024.svg)]()
<!-- SPDX-FileCopyrightText: no
SPDX-License-Identifier: CC0-1.0
-->
# Calamares: Distribution-Independent Installer Framework
---------
[![Current issue](https://img.shields.io/badge/issue-in_progress-FE9B48)](https://github.com/calamares/calamares/labels/hacking%3A%20in-progress)
[![GitHub release](https://img.shields.io/github/release/calamares/calamares.svg)](https://github.com/calamares/calamares/releases)
[![GitHub Build Status](https://img.shields.io/github/actions/workflow/status/calamares/calamares/push.yml)](https://github.com/calamares/calamares/actions?query=workflow%3Aci)
[![GitHub license](https://img.shields.io/badge/license-Multiple-green)](https://github.com/calamares/calamares/tree/calamares/LICENSES)
| [Report a Bug](https://github.com/calamares/calamares/issues/new) | [Translate](https://app.transifex.com/calamares/calamares/) | [Contribute](CONTRIBUTING.md) | [Chat on Matrix: #calamares:kde.org](https://webchat.kde.org/#/room/%23calamares:kde.org) | [Wiki](https://github.com/calamares/calamares/wiki) |
|:--:|:--:|:--:|:--:|:--:|
> Calamares is a distribution-independent system installer, with an advanced partitioning
> feature for both manual and automated partitioning operations. Calamares is designed to
> be customizable by distribution maintainers without the need for cumbersome patching,
> thanks to third-party branding and external modules support.
## Target Audience
Calamares is a Linux installer; users who install Linux on a computer will hopefully
use it just **once**, to install their Linux distribution. Calamares is not
a "ready to use" application: distributions apply a huge amount of customization
and configuration to Calamares, and the target audience for this repository
is those distributions, and the people who make those Linux distros.
Calamares has some [generic user documentation](https://calamares.io/docs/users-guide/)
for end-users, but most of what we have is for distro developers.
## Getting Calamares
Clone Calamares from GitHub. The default branch is called *calamares*.
```
git clone https://github.com/calamares/calamares.git
```
Calamares is a KDE-Frameworks and Qt-based, C++17, CMake-built application.
The dependencies are explained in [CONTRIBUTING.md](CONTRIBUTING.md).
## Contributing to Calamares
Calamares welcomes PRs. New issues are welcome, too.
There are both the Calamares **core** repository (this one)
and an **extensions** repository ([Calamares extensions](https://github.com/calamares/calamares-extensions)).
Contributions to code, modules, documentation, the wiki, and the website are all welcome.
There is more information in the [CONTRIBUTING.md](CONTRIBUTING.md) file.
## Join the Conversation
GitHub Issues are **one** place for discussing Calamares if there are concrete
problems or a new feature to discuss.
Issues are not a help channel.
Visit Matrix for help with configuration or compilation.
Regular Calamares development chit-chat happens in a [Matrix](https://matrix.org/)
room, `#calamares:kde.org`. Responsiveness is best during the day
in Europe, but feel free to idle.
Matrix is persistent, and we'll see your message eventually.
* [![Join us on Matrix](https://img.shields.io/badge/Matrix-%23calamares:kde.org-blue)](https://webchat.kde.org/#/room/%23calamares:kde.org) (needs a Matrix account)

7
calamares_polkit Normal file
View File

@ -0,0 +1,7 @@
#!/bin/bash
if [ $(which pkexec) ]; then
pkexec --disable-internal-agent "/usr/bin/calamares" "$@"
else
/usr/bin/calamares "$@"
fi

View File

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="22"
height="22"
id="svg3049"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="boot-environment.svg"
inkscape:export-filename="/home/uri/.kde/share/icons/NITRUX-KDE/16x16/actions/view-right-new.png"
inkscape:export-xdpi="30"
inkscape:export-ydpi="30"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3051" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="34.047365"
inkscape:cx="-2.3349825"
inkscape:cy="12.556038"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="false"
borderlayer="true"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<sodipodi:guide
position="2.0000044,20.00003"
orientation="18,0"
id="guide4067"
inkscape:locked="false" />
<sodipodi:guide
position="2.0000044,2.0000296"
orientation="0,18"
id="guide4069"
inkscape:locked="false" />
<sodipodi:guide
position="20.000004,2.0000296"
orientation="-18,0"
id="guide4071"
inkscape:locked="false" />
<sodipodi:guide
position="20.000004,20.00003"
orientation="0,-18"
id="guide4073"
inkscape:locked="false" />
<sodipodi:guide
position="3.0000044,19.00003"
orientation="16,0"
id="guide4077"
inkscape:locked="false" />
<sodipodi:guide
position="3.0000044,3.0000296"
orientation="0,16"
id="guide4079"
inkscape:locked="false" />
<sodipodi:guide
position="19.000004,3.0000296"
orientation="-16,0"
id="guide4081"
inkscape:locked="false" />
<sodipodi:guide
position="19.000004,19.00003"
orientation="0,-16"
id="guide4083"
inkscape:locked="false" />
<inkscape:grid
type="xygrid"
id="grid4085" />
</sodipodi:namedview>
<metadata
id="metadata3054">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-421.71429,-525.79074)">
<path
inkscape:connector-curvature="0"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.55026455"
d="m 430.71429,533.79074 0,6 5,-3 -5,-3 z"
id="rect4144" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none"
d="M 11 3 C 10.32479 3.004 9.65279 3.092995 9 3.265625 L 9 4.2988281 L 9 4.3105469 A 7 7 0 0 0 7.6835938 4.8554688 L 7.6757812 4.8476562 L 6.9433594 4.1152344 C 5.7764094 4.8032844 4.8032844 5.7764094 4.1152344 6.9433594 L 4.6367188 7.4648438 L 4.8554688 7.6835938 A 7 7 0 0 0 4.3085938 9 L 4.2949219 9 L 3.2597656 9 C 3.0891456 9.65304 3.00187 10.32505 3 11 C 3.004 11.67521 3.093005 12.34721 3.265625 13 L 4.2988281 13 L 4.3105469 13 A 7 7 0 0 0 4.8554688 14.316406 L 4.6367188 14.535156 L 4.1152344 15.056641 C 4.8032844 16.223601 5.7763994 17.196716 6.9433594 17.884766 L 7.4648438 17.363281 L 7.6835938 17.144531 A 7 7 0 0 0 9 17.691406 L 9 18 L 9 18.740234 C 9.65304 18.910854 10.32504 18.99813 11 19 C 11.67496 18.99813 12.34696 18.910854 13 18.740234 L 13 18 L 13 17.691406 A 7 7 0 0 0 14.316406 17.144531 L 14.535156 17.363281 L 15.056641 17.884766 C 16.223601 17.196716 17.196716 16.223601 17.884766 15.056641 L 17.363281 14.535156 L 17.144531 14.316406 A 7 7 0 0 0 17.689453 13 L 17.701172 13 L 18.734375 13 C 18.907005 12.34721 18.996 11.67521 19 11 C 18.99813 10.32505 18.910854 9.65304 18.740234 9 L 17.705078 9 L 17.691406 9 A 7 7 0 0 0 17.144531 7.6835938 L 17.363281 7.4648438 L 17.884766 6.9433594 C 17.196716 5.7764094 16.223591 4.8032844 15.056641 4.1152344 L 14.324219 4.8476562 L 14.316406 4.8554688 A 7 7 0 0 0 13 4.3105469 L 13 4.2988281 L 13 3.265625 C 12.34721 3.092995 11.67521 3.004 11 3 z M 11 4 C 11.33491 4.0012 11.66956 4.0273719 12 4.0761719 L 12 4.0800781 L 12 5 L 12 5.0859375 A 6 6 0 0 1 14.470703 6.1152344 L 14.535156 6.0507812 L 15.185547 5.4003906 L 15.1875 5.3984375 C 15.72484 5.7991075 16.201446 6.2742469 16.603516 6.8105469 L 16.599609 6.8144531 L 15.949219 7.4648438 L 15.886719 7.5273438 A 6 6 0 0 1 16.910156 10 L 17 10 L 17.921875 10 L 17.925781 10 C 17.974081 10.33106 17.9995 10.66455 18 11 C 17.9988 11.33491 17.972628 11.66955 17.923828 12 L 17.919922 12 L 17 12 L 16.914062 12 A 6 6 0 0 1 15.884766 14.470703 L 15.949219 14.535156 L 16.599609 15.185547 L 16.601562 15.1875 C 16.200893 15.72484 15.725753 16.201456 15.189453 16.603516 L 15.185547 16.599609 L 14.535156 15.949219 L 14.472656 15.886719 A 6 6 0 0 1 12 16.910156 L 12 17 L 12 17.921875 L 12 17.925781 C 11.66894 17.974081 11.33545 17.9995 11 18 C 10.66455 17.9995 10.33106 17.974081 10 17.925781 L 10 17.921875 L 10 17 L 10 16.910156 A 6 6 0 0 1 7.5273438 15.886719 L 7.4648438 15.949219 L 6.8144531 16.599609 L 6.8105469 16.603516 C 6.2742469 16.201456 5.7991075 15.72484 5.3984375 15.1875 L 5.4003906 15.185547 L 6.0507812 14.535156 L 6.1152344 14.470703 A 6 6 0 0 1 5.0859375 12 L 5 12 L 4.0800781 12 L 4.0761719 12 C 4.0273719 11.66955 4.0012 11.33491 4 11 C 4.0005 10.66455 4.0259187 10.33106 4.0742188 10 L 4.078125 10 L 5 10 L 5.0898438 10 A 6 6 0 0 1 6.1132812 7.5273438 L 6.0507812 7.4648438 L 5.4003906 6.8144531 L 5.3964844 6.8105469 C 5.7985544 6.2742469 6.27516 5.7991075 6.8125 5.3984375 L 6.8144531 5.4003906 L 7.4648438 6.0507812 L 7.5292969 6.1152344 A 6 6 0 0 1 10 5.0859375 L 10 5 L 10 4.0800781 L 10 4.0761719 C 10.33044 4.0273719 10.66509 4.0012 11 4 z "
transform="translate(421.71429,525.79074)"
id="path3344" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

122
data/images/bugs.svg Normal file
View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="22"
height="22"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
viewBox="0 0 22 22"
sodipodi:docname="bugs.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.534679"
inkscape:cx="-17.989231"
inkscape:cy="14.348037"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
showguides="true"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<sodipodi:guide
position="2,20.000017"
orientation="18,0"
id="guide4066"
inkscape:locked="false" />
<sodipodi:guide
position="2,2.0000174"
orientation="0,18"
id="guide4068"
inkscape:locked="false" />
<sodipodi:guide
position="20,2.0000174"
orientation="-18,0"
id="guide4070"
inkscape:locked="false" />
<sodipodi:guide
position="20,20.000017"
orientation="0,-18"
id="guide4072"
inkscape:locked="false" />
<sodipodi:guide
position="3,19.000017"
orientation="16,0"
id="guide4074"
inkscape:locked="false" />
<sodipodi:guide
position="3,3.0000174"
orientation="0,16"
id="guide4076"
inkscape:locked="false" />
<sodipodi:guide
position="19,3.0000174"
orientation="-16,0"
id="guide4078"
inkscape:locked="false" />
<sodipodi:guide
position="19,19.000017"
orientation="0,-16"
id="guide4080"
inkscape:locked="false" />
<inkscape:grid
type="xygrid"
id="grid4101" />
<sodipodi:guide
position="8,19.000017"
orientation="0,-5"
id="guide4124"
inkscape:locked="false" />
<sodipodi:guide
position="11,3.0000174"
orientation="0,4"
id="guide4241"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none"
d="M 19 3 C 17.68077 3.271305 16.541542 4.064283 15.818359 5.1777344 C 15.568079 5.0654932 15.292985 5 15 5 C 14.79149 5 14.594956 5.0409358 14.40625 5.0996094 C 13.268812 4.4058956 11.935191 4 10.5 4 C 6.3449984 4 3 7.3449984 3 11.5 C 3 15.655002 6.3449984 19 10.5 19 C 14.655002 19 18 15.655002 18 11.5 C 18 10.064809 17.594104 8.7311878 16.900391 7.59375 C 16.959064 7.4050437 17 7.2085104 17 7 C 17 6.5519679 16.850519 6.143249 16.603516 5.8105469 C 17.139054 4.9388103 17.989262 4.2918607 19 4.0292969 L 19 3 z M 6.3183594 6.5175781 C 5.3707373 7.6464984 4.8007813 9.1032501 4.8007812 10.699219 C 4.8007812 14.30022 7.6997802 17.199219 11.300781 17.199219 C 12.896226 17.199219 14.351703 16.628704 15.480469 15.681641 C 14.28996 17.099389 12.504603 18 10.5 18 C 6.8989984 18 4 15.101002 4 11.5 C 4 9.4949666 4.9000837 7.7080867 6.3183594 6.5175781 z "
transform="translate(0,1030.3622)"
id="rect4111" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 32 32"
version="1.1"
id="svg2704"
sodipodi:docname="help-donate.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview2706"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="28.0625"
inkscape:cx="8.8908686"
inkscape:cy="16.017817"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:current-layer="svg2704" />
<defs
id="defs3051">
<style
type="text/css"
id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path
style="fill:#7f7fff;fill-opacity:1;stroke:none"
d="m 5,9 0,1 -1,0 0,12 1,0 0,1 22,0 0,-1 1,0 0,-12 -1,0 0,-1 z m 1,1 20,0 a 1,1 0 0 0 1,1 l 0,10 a 1,1 0 0 0 -1,1 L 6,22 A 1,1 0 0 0 5,21 L 5,11 a 1,1 0 0 0 1,-1 m 10,2 a 4,4 0 0 0 -4,4 4,4 0 0 0 4,4 4,4 0 0 0 4,-4 4,4 0 0 0 -4,-4 m 0,1 a 3,3 0 0 1 3,3 3,3 0 0 1 -3,3 3,3 0 0 1 -3,-3 3,3 0 0 1 3,-3"
id="path76"
class="ColorScheme-Text" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

180
data/images/help.svg Normal file
View File

@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="22"
height="22"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="help.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="13.085735"
inkscape:cx="-2.1779442"
inkscape:cy="13.48797"
inkscape:document-units="px"
inkscape:current-layer="g846"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="false"
showguides="true"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4108" />
<sodipodi:guide
position="1.9999987,20.000051"
orientation="18,0"
id="guide4114"
inkscape:locked="false" />
<sodipodi:guide
position="1.9999987,2.0000511"
orientation="0,18"
id="guide4116"
inkscape:locked="false" />
<sodipodi:guide
position="19.999999,2.0000511"
orientation="-18,0"
id="guide4118"
inkscape:locked="false" />
<sodipodi:guide
position="19.999999,20.000051"
orientation="0,-18"
id="guide4120"
inkscape:locked="false" />
<sodipodi:guide
position="2.9999987,19.000051"
orientation="16,0"
id="guide4122"
inkscape:locked="false" />
<sodipodi:guide
position="9,3"
orientation="0,16"
id="guide4124"
inkscape:locked="false" />
<sodipodi:guide
position="18.999999,3.0000511"
orientation="-16,0"
id="guide4126"
inkscape:locked="false" />
<sodipodi:guide
position="18.999999,19.000051"
orientation="0,-16"
id="guide4128"
inkscape:locked="false" />
<sodipodi:guide
position="3.0001595,6.0074575"
orientation="0.70710678,0.70710678"
id="guide4293"
inkscape:locked="false" />
<sodipodi:guide
position="13.000084,14.593168"
orientation="-0.70710678,-0.70710678"
id="guide4297"
inkscape:locked="false" />
<sodipodi:guide
position="13.59239,14"
orientation="9.2928177,-9.2928177"
id="guide4303"
inkscape:locked="false" />
<sodipodi:guide
position="5.0070239,3.99973"
orientation="-9.2928177,9.2928177"
id="guide4307"
inkscape:locked="false" />
<sodipodi:guide
position="14.299842,13.292548"
orientation="-0.70710678,-0.70710678"
id="guide4309"
inkscape:locked="false" />
<sodipodi:guide
position="12.292977,15.300275"
orientation="9.2928177,-9.2928177"
id="guide4313"
inkscape:locked="false" />
<sodipodi:guide
position="3.0001595,6.0074575"
orientation="0.70710678,0.70710678"
id="guide4315"
inkscape:locked="false" />
<sodipodi:guide
position="3.7072663,5.3003507"
orientation="-9.2928177,9.2928177"
id="guide4317"
inkscape:locked="false" />
<sodipodi:guide
position="13.000084,14.593168"
orientation="-0.70710678,-0.70710678"
id="guide4319"
inkscape:locked="false" />
<sodipodi:guide
position="1.9999987,4.0001732"
orientation="1.0001221,0"
id="guide4342"
inkscape:locked="false" />
<sodipodi:guide
position="1.9999987,3.0000511"
orientation="0,3.0074539"
id="guide4344"
inkscape:locked="false" />
<sodipodi:guide
position="5.0074526,3.0000511"
orientation="-1.0001221,0"
id="guide4346"
inkscape:locked="false" />
<sodipodi:guide
position="5.0074526,4.0001732"
orientation="0,-3.0074539"
id="guide4348"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
id="g846"
transform="translate(-61.043672,-14.648105)">
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none"
d="M 11,3 C 9.1218971,3 7.4030555,3.6450374 6.0410156,4.7207031 c -0.00511,0.00403 -0.01053,0.00767 -0.015625,0.011719 -0.053047,0.042104 -0.10627,0.083538 -0.1582031,0.1269531 L 5.0078125,4 3,4 3,6.0078125 4.0429688,7.0507812 C 3.3827678,8.2153736 3,9.5604392 3,11 c 0,1.439561 0.3827678,2.784626 1.0429688,3.949219 L 3,15.992188 3,18 l 2.0078125,0 0.859375,-0.859375 c 0.051933,0.04341 0.1051562,0.08485 0.1582031,0.126953 0.0051,0.004 0.010518,0.0077 0.015625,0.01172 C 7.4030555,18.354963 9.1218971,19 11,19 c 1.958443,0 3.745099,-0.699284 5.132812,-1.859375 L 16.992188,18 19,18 19,15.992188 17.957031,14.949219 C 18.617232,13.784626 19,12.439561 19,11 19,9.5604392 18.617232,8.2153736 17.957031,7.0507812 L 19,6.0078125 19,4 16.992188,4 16.132812,4.859375 c -0.05193,-0.043415 -0.105156,-0.084849 -0.158203,-0.1269531 -0.0051,-0.00404 -0.01052,-0.00769 -0.01563,-0.011719 C 14.596944,3.6450374 12.878103,3 11,3 Z m 0,1 c 1.240475,0 2.401828,0.3213657 3.410156,0.8828125 L 12.117188,7.1757812 C 11.760745,7.0722749 11.390711,7 11,7 10.609289,7 10.239255,7.0722749 9.8828125,7.1757812 L 8.7070312,6 7.5898438,4.8828125 C 8.5981723,4.3213657 9.7595253,4 11,4 Z m -6.6992188,0.7070312 0.84375,0.84375 C 5.0017761,5.7041722 4.8628506,5.861065 4.7324219,6.0253906 c -0.00404,0.0051 -0.00769,0.010518 -0.011719,0.015625 -0.040368,0.051115 -0.078055,0.1041288 -0.1171875,0.15625 L 3.7070312,5.3007812 Z m 13.3984378,0 0.59375,0.59375 -0.896485,0.8964844 C 17.227386,5.9720391 17.046973,5.7565533 16.855469,5.5507812 Z M 4.8828125,7.5898438 7.1757812,9.8828125 C 7.0722749,10.239255 7,10.609289 7,11 c 0,0.390711 0.072275,0.760745 0.1757812,1.117188 L 6,13.292969 4.8828125,14.410156 C 4.3213657,13.401828 4,12.240475 4,11 4,9.7595253 4.3213657,8.5981723 4.8828125,7.5898438 Z m 12.2343755,0 C 17.678634,8.5981723 18,9.7595253 18,11 c 0,1.240475 -0.321366,2.401828 -0.882812,3.410156 L 16,13.292969 14.824219,12.117188 C 14.927725,11.760745 15,11.390711 15,11 15,10.609289 14.927725,10.239255 14.824219,9.8828125 Z M 11,8 c 0.09117,0 0.176574,0.019459 0.265625,0.027344 0.394743,0.034951 0.764336,0.1424372 1.099609,0.3144531 0.557016,0.2857828 1.007186,0.7359534 1.292969,1.2929687 0.172016,0.3352737 0.279502,0.7048664 0.314453,1.0996094 C 13.980541,10.823426 14,10.908831 14,11 c 0,0.09117 -0.01946,0.176574 -0.02734,0.265625 -0.03495,0.394743 -0.142437,0.764336 -0.314453,1.099609 -0.285783,0.557016 -0.735953,1.007186 -1.292969,1.292969 -0.335273,0.172016 -0.704866,0.279502 -1.099609,0.314453 C 11.176574,13.980541 11.091169,14 11,14 10.908831,14 10.823426,13.980541 10.734375,13.972656 10.339632,13.937705 9.9700393,13.830219 9.6347656,13.658203 9.0777503,13.37242 8.6275797,12.92225 8.3417969,12.365234 8.169781,12.029961 8.0622952,11.660368 8.0273438,11.265625 8.0194589,11.176574 8,11.091169 8,11 8,10.908831 8.0194589,10.823426 8.0273438,10.734375 8.0622951,10.339632 8.169781,9.9700393 8.3417969,9.6347656 8.6275797,9.0777503 9.0777503,8.6275797 9.6347656,8.3417969 9.9700393,8.169781 10.339632,8.0622952 10.734375,8.0273438 10.823426,8.0194589 10.908831,8 11,8 Z M 9.8828125,14.824219 C 10.239255,14.927725 10.609289,15 11,15 c 0.390711,0 0.760745,-0.07227 1.117188,-0.175781 l 2.292968,2.292969 C 13.401828,17.678634 12.240475,18 11,18 9.7595253,18 8.5981723,17.678634 7.5898438,17.117188 L 8.7070312,16 Z m -5.2792969,0.978515 c 0.1690983,0.225227 0.3495114,0.440713 0.5410156,0.646485 l -0.84375,0.84375 -0.59375,-0.59375 z m 12.7929684,0 0.896485,0.896485 -0.59375,0.59375 -0.84375,-0.84375 c 0.191504,-0.205772 0.371917,-0.421258 0.541015,-0.646485 z"
transform="translate(61.043672,1045.0103)"
id="rect4216"
inkscape:connector-curvature="0"
sodipodi:nodetypes="scscccccscccccccscccccscccccccssccscccsccscccccccccccscccsccscccsccssssssssssssssssssssscsccsccccccccccccc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

View File

@ -0,0 +1,426 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100"
height="100"
viewBox="0 0 100 100"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-alongside.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-8"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-2">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-3"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-9">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-9"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-7"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-1">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-7"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-1">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-3"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4955">
<rect
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4957"
width="60"
height="25"
x="20"
y="990.36218"
ry="2.99998" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4962">
<circle
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4964"
cx="50"
cy="44.000023"
r="15" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="70.562503"
inkscape:cy="70.437503"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
guidetolerance="10000"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="1080"
inkscape:window-y="519"
inkscape:window-maximized="0"
objecttolerance="50"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4136" />
<sodipodi:guide
position="15,35"
orientation="1,0"
id="guide4140"
inkscape:locked="false" />
<sodipodi:guide
position="85,30"
orientation="1,0"
id="guide4144"
inkscape:locked="false" />
<sodipodi:guide
position="30,80"
orientation="0,1"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="20,60"
orientation="1,0"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="40,20"
orientation="0,1"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="80,60"
orientation="1,0"
id="guide4152"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0,1"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="-0.70710678,0.70710678"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0.70710678,0.70710678"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="50,25"
orientation="1,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="29,44"
orientation="1,0"
id="guide4366"
inkscape:locked="false" />
<sodipodi:guide
position="71,45"
orientation="1,0"
id="guide4368"
inkscape:locked="false" />
<sodipodi:guide
position="57,39"
orientation="0,1"
id="guide4370"
inkscape:locked="false" />
<sodipodi:guide
position="257,55"
orientation="1,0"
id="guide5234"
inkscape:locked="false" />
<sodipodi:guide
position="268,52"
orientation="1,0"
id="guide5236"
inkscape:locked="false" />
<sodipodi:guide
position="263,61"
orientation="0,1"
id="guide5238"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-952.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -600,752.36216 v 0"
id="path4763"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<g
id="g4568"
transform="matrix(0.78550119,0,0,0.79372033,-5.340306,202.88184)">
<ellipse
ry="14.728739"
rx="15.004815"
cy="1001.2313"
cx="40.880253"
id="path4971-1"
style="opacity:1;fill:#ff8585;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 40.853284,985.33496 a 16.10437,15.937576 0 0 0 -16.104273,15.93744 16.10437,15.937576 0 0 0 16.104273,15.9375 16.10437,15.937576 0 0 0 16.104274,-15.9375 16.10437,15.937576 0 0 0 -16.104274,-15.93744 z m 0.09188,1.47908 a 14.701592,14.549327 0 0 1 14.701597,14.54936 14.701592,14.549327 0 0 1 -14.701592,14.5493 14.701592,14.549327 0 0 1 -14.701592,-14.5493 14.701592,14.549327 0 0 1 14.701592,-14.54936 z"
id="path4205-5-8-4"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="rect4196-3-2-6"
d="m 26.047103,979.53938 c -3.963674,0 -7.154322,3.1576 -7.154322,7.08022 l 0,43.7945 c 0,3.9227 3.190648,7.0802 7.154322,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.7945 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46628 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3467 -4.392102,-4.3467 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42628 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z M 24.748916,1030.25 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="24.748913"
id="path4212-4-9-5"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="56.957657"
id="path4214-4-5-2"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1001.401"
cx="40.983227"
id="path4216-6-6-3"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4224-1-5-6"
d="m 37.799402,1010.7439 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8922 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4945 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1031.6989"
cx="56.957657"
id="path4231-2-9-5"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="opacity:1;fill:#ff8585;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 74,1009.3622 c -7.082997,0 -12.824893,-5.234 -12.824863,-11.69056 1e-5,-6.45647 5.741893,-11.69048 12.824863,-11.69048 0,7.47315 0,10.47316 0,23.38104 z"
id="path4971-1-6-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscc" />
<g
id="g4568-5"
transform="matrix(0.78550119,0,0,0.79372033,41.159698,202.88185)">
<path
style="opacity:1;fill:#7f3fbf;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 41.152308,1015.9601 c 8.286955,0 15.004849,-6.5943 15.004815,-14.7288 -1.1e-5,-8.13445 -6.717892,-14.72872 -15.004815,-14.72872 0,9.41535 0,13.19502 0,29.45752 z"
id="path4971-1-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscc" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 40.853284,985.33496 a 16.10437,15.937576 0 0 0 -16.104273,15.93744 16.10437,15.937576 0 0 0 16.104273,15.9375 16.10437,15.937576 0 0 0 16.104274,-15.9375 16.10437,15.937576 0 0 0 -16.104274,-15.93744 z m 0.09188,1.47908 a 14.701592,14.549327 0 0 1 14.701597,14.54936 14.701592,14.549327 0 0 1 -14.701592,14.5493 14.701592,14.549327 0 0 1 -14.701592,-14.5493 14.701592,14.549327 0 0 1 14.701592,-14.54936 z"
id="path4205-5-8-4-1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="rect4196-3-2-6-3"
d="m 26.047103,979.53938 c -3.963674,0 -7.154322,3.1576 -7.154322,7.08022 l 0,43.7945 c 0,3.9227 3.190648,7.0802 7.154322,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.7945 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46628 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3467 -4.392102,-4.3467 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42628 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z M 24.748916,1030.25 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="24.748913"
id="path4212-4-9-5-9"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="56.957657"
id="path4214-4-5-2-6"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1001.401"
cx="40.983227"
id="path4216-6-6-3-3"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4224-1-5-6-7"
d="m 37.799402,1010.7439 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8922 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4945 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1031.6989"
cx="56.957657"
id="path4231-2-9-5-0"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#7f7fff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 55,1002.3622 -4,-5.00004 0,3.00004 -6,0 0,4 6,0 0,3 z"
id="path4542"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,309 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100"
height="100"
viewBox="0 0 100 100"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-disk.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-8"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-2">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-3"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-9">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-9"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-7"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-1">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-7"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-1">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-3"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4955">
<rect
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4957"
width="60"
height="25"
x="20"
y="990.36218"
ry="2.99998" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4962">
<circle
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4964"
cx="50"
cy="44.000023"
r="15" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="74.4375"
inkscape:cy="15.9375"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
guidetolerance="10000"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4136" />
<sodipodi:guide
position="15,35"
orientation="1,0"
id="guide4140"
inkscape:locked="false" />
<sodipodi:guide
position="30,15"
orientation="0,1"
id="guide4142"
inkscape:locked="false" />
<sodipodi:guide
position="85,30"
orientation="1,0"
id="guide4144"
inkscape:locked="false" />
<sodipodi:guide
position="30,80"
orientation="0,1"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="20,60"
orientation="1,0"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="40,20"
orientation="0,1"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="80,60"
orientation="1,0"
id="guide4152"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0,1"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="-0.70710678,0.70710678"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0.70710678,0.70710678"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="50,25"
orientation="1,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="29,44"
orientation="1,0"
id="guide4366"
inkscape:locked="false" />
<sodipodi:guide
position="71,45"
orientation="1,0"
id="guide4368"
inkscape:locked="false" />
<sodipodi:guide
position="55,81"
orientation="0,1"
id="guide4372"
inkscape:locked="false" />
<sodipodi:guide
position="257,55"
orientation="1,0"
id="guide5234"
inkscape:locked="false" />
<sodipodi:guide
position="268,52"
orientation="1,0"
id="guide5236"
inkscape:locked="false" />
<sodipodi:guide
position="263,61"
orientation="0,1"
id="guide5238"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-952.36216)">
<path
style="fill:#7f7fff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m -600,752.36216 v 0"
id="path4763"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path4205-5"
d="m 49.977845,976.19447 a 16.10437,15.937576 0 0 0 -16.104273,15.93747 16.10437,15.937576 0 0 0 16.104273,15.93746 16.10437,15.937576 0 0 0 16.104274,-15.93746 16.10437,15.937576 0 0 0 -16.104274,-15.93747 z m 0.09188,1.47908 A 14.701592,14.549327 0 0 1 64.771322,992.22288 14.701592,14.549327 0 0 1 50.06973,1006.7722 14.701592,14.549327 0 0 1 35.368138,992.22288 14.701592,14.549327 0 0 1 50.06973,977.67355 Z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 35.171664,970.39889 c -3.963674,0 -7.154321,3.1576 -7.154321,7.08022 l 0,43.79439 c 0,3.9227 3.190647,7.0802 7.154321,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.79439 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46617 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3466 -4.392102,-4.3466 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42627 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z m -1.464033,47.81278 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
id="rect4196-3"
inkscape:connector-curvature="0" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4212-4"
cx="33.873478"
cy="976.1944"
rx="1.4640336"
ry="1.4488705" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4214-4"
cx="66.082214"
cy="976.1944"
rx="1.4640336"
ry="1.4488705" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4216-6"
cx="50.107792"
cy="992.26056"
rx="1.4640336"
ry="1.4488705" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 46.923963,1001.6034 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8921 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4944 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
id="path4224-1"
inkscape:connector-curvature="0" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4231-2"
cx="66.082214"
cy="1022.5583"
rx="1.4640336"
ry="1.4488705" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,379 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100"
height="100"
viewBox="0 0 100 100"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-erase-auto.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-8"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-2">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-3"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-9">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-9"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-7"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-1">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-7"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-1">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-3"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4955">
<rect
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4957"
width="60"
height="25"
x="20"
y="990.36218"
ry="2.99998" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4962">
<circle
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4964"
cx="50"
cy="44.000023"
r="15" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="69.437503"
inkscape:cy="65.687503"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
guidetolerance="10000"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="1080"
inkscape:window-y="519"
inkscape:window-maximized="0"
objecttolerance="50"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4136" />
<sodipodi:guide
position="15,35"
orientation="1,0"
id="guide4140"
inkscape:locked="false" />
<sodipodi:guide
position="85,30"
orientation="1,0"
id="guide4144"
inkscape:locked="false" />
<sodipodi:guide
position="30,80"
orientation="0,1"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="20,60"
orientation="1,0"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="40,20"
orientation="0,1"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="80,60"
orientation="1,0"
id="guide4152"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0,1"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="-0.70710678,0.70710678"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0.70710678,0.70710678"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="50,25"
orientation="1,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="29,44"
orientation="1,0"
id="guide4366"
inkscape:locked="false" />
<sodipodi:guide
position="71,45"
orientation="1,0"
id="guide4368"
inkscape:locked="false" />
<sodipodi:guide
position="57,39"
orientation="0,1"
id="guide4370"
inkscape:locked="false" />
<sodipodi:guide
position="257,55"
orientation="1,0"
id="guide5234"
inkscape:locked="false" />
<sodipodi:guide
position="268,52"
orientation="1,0"
id="guide5236"
inkscape:locked="false" />
<sodipodi:guide
position="263,61"
orientation="0,1"
id="guide5238"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-952.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -600,752.36216 v 0"
id="path4763"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<g
id="g4218">
<g
transform="matrix(1.0337074,0,0,1.0326542,3.6558031,-39.163288)"
id="g4568">
<ellipse
style="opacity:1;fill:#7f3fbf;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4971-1"
cx="40.880253"
cy="1001.2313"
rx="15.004815"
ry="14.728739" />
<path
inkscape:connector-curvature="0"
id="path4205-5-8-4"
d="m 40.853284,985.33496 a 16.10437,15.937576 0 0 0 -16.104273,15.93744 16.10437,15.937576 0 0 0 16.104273,15.9375 16.10437,15.937576 0 0 0 16.104274,-15.9375 16.10437,15.937576 0 0 0 -16.104274,-15.93744 z m 0.09188,1.47908 a 14.701592,14.549327 0 0 1 14.701597,14.54936 14.701592,14.549327 0 0 1 -14.701592,14.5493 14.701592,14.549327 0 0 1 -14.701592,-14.5493 14.701592,14.549327 0 0 1 14.701592,-14.54936 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 26.047103,979.53938 c -3.963674,0 -7.154322,3.1576 -7.154322,7.08022 l 0,43.7945 c 0,3.9227 3.190648,7.0802 7.154322,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.7945 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46628 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3467 -4.392102,-4.3467 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42628 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z M 24.748916,1030.25 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
id="rect4196-3-2-6"
inkscape:connector-curvature="0" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4212-4-9-5"
cx="24.748913"
cy="985.33484"
rx="1.4640336"
ry="1.4488705" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4214-4-5-2"
cx="56.957657"
cy="985.33484"
rx="1.4640336"
ry="1.4488705" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4216-6-6-3"
cx="40.983227"
cy="1001.401"
rx="1.4640336"
ry="1.4488705" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 37.799402,1010.7439 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8922 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4945 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
id="path4224-1-5-6"
inkscape:connector-curvature="0" />
<ellipse
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4231-2-9-5"
cx="56.957657"
cy="1031.6989"
rx="1.4640336"
ry="1.4488705" />
</g>
<path
inkscape:connector-curvature="0"
id="path4870-1"
d="m 45.724909,1036.5035 35.400121,0 -17.70006,-28.1878 z"
style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#ff8585;stroke-width:1.74133098;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="flowRoot4872-0"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="matrix(1.2391643,0,0,1.2267993,107.86061,970.12059)">
<path
id="path4216"
style="font-size:20px"
d="m -36.982422,49.454514 1.982422,0 0,2.480469 -1.982422,0 0,-2.480469 z m 0,-12.099609 1.982422,0 0,6.396484 -0.195312,3.486329 -1.582032,0 -0.205078,-3.486329 0,-6.396484 z" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,354 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100"
height="100"
viewBox="0 0 100 100"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-manual.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-8"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-2">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-3"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-9">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-9"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-7"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-1">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-7"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-1">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-3"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4955">
<rect
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4957"
width="60"
height="25"
x="20"
y="990.36218"
ry="2.99998" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4962">
<circle
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4964"
cx="50"
cy="44.000023"
r="15" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="45.1875"
inkscape:cy="53.9375"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
guidetolerance="10000"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="1080"
inkscape:window-y="519"
inkscape:window-maximized="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4136" />
<sodipodi:guide
position="15,35"
orientation="1,0"
id="guide4140"
inkscape:locked="false" />
<sodipodi:guide
position="30,15"
orientation="0,1"
id="guide4142"
inkscape:locked="false" />
<sodipodi:guide
position="85,30"
orientation="1,0"
id="guide4144"
inkscape:locked="false" />
<sodipodi:guide
position="30,80"
orientation="0,1"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="20,60"
orientation="1,0"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="40,20"
orientation="0,1"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="80,60"
orientation="1,0"
id="guide4152"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0,1"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="-0.70710678,0.70710678"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="54,46"
orientation="0.70710678,0.70710678"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="50,25"
orientation="1,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="29,44"
orientation="1,0"
id="guide4366"
inkscape:locked="false" />
<sodipodi:guide
position="71,45"
orientation="1,0"
id="guide4368"
inkscape:locked="false" />
<sodipodi:guide
position="57,39"
orientation="0,1"
id="guide4370"
inkscape:locked="false" />
<sodipodi:guide
position="55,81"
orientation="0,1"
id="guide4372"
inkscape:locked="false" />
<sodipodi:guide
position="257,55"
orientation="1,0"
id="guide5234"
inkscape:locked="false" />
<sodipodi:guide
position="268,52"
orientation="1,0"
id="guide5236"
inkscape:locked="false" />
<sodipodi:guide
position="263,61"
orientation="0,1"
id="guide5238"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-952.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -600,752.36216 v 0"
id="path4763"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<g
id="g4223">
<path
sodipodi:nodetypes="cccccc"
transform="matrix(0.73507962,0,0,0.72746634,13.31575,270.3128)"
clip-path="none"
inkscape:connector-curvature="0"
id="path4358"
d="m 50,992.36216 5.677324,-20.4157 8.206258,4.68191 4.257601,5.33413 2.574196,6.91365 z"
style="fill:#ff8585;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
transform="matrix(0.73507962,0,0,0.72746634,13.31575,270.3128)"
clip-path="none"
inkscape:connector-curvature="0"
id="path4360"
d="m 50,992.36216 3.677324,-21.02321 -10.522852,1.06075 -8.787662,5.8785 z"
style="fill:#7f3fbf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccccccc"
transform="matrix(0.73507962,0,0,0.72746634,13.31575,270.3128)"
clip-path="none"
inkscape:connector-curvature="0"
id="path4362"
d="m 50,992.36216 -17.212338,-12.71946 -3.759514,10.96246 2.541095,12.27104 4.917811,5.4812 12.573068,5.1495 10.496959,-2.4532 z"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
transform="matrix(0.73507962,0,0,0.72746634,13.31575,270.3128)"
clip-path="none"
inkscape:connector-curvature="0"
id="path4364"
d="m 50,992.36216 11.677324,17.75224 7.573068,-8.8177 1.743527,-10.05604 z"
style="fill:#a3a3ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 49.977845,976.19447 a 16.10437,15.937576 0 0 0 -16.104273,15.93747 16.10437,15.937576 0 0 0 16.104273,15.93746 16.10437,15.937576 0 0 0 16.104274,-15.93746 16.10437,15.937576 0 0 0 -16.104274,-15.93747 z m 0.09188,1.47908 A 14.701592,14.549327 0 0 1 64.771322,992.22288 14.701592,14.549327 0 0 1 50.06973,1006.7722 14.701592,14.549327 0 0 1 35.368138,992.22288 14.701592,14.549327 0 0 1 50.06973,977.67355 Z"
id="path4205-5"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="rect4196-3"
d="m 35.171664,970.39889 c -3.963674,0 -7.154321,3.1576 -7.154321,7.08022 l 0,43.79439 c 0,3.9227 3.190647,7.0802 7.154321,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.79439 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46617 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3466 -4.392102,-4.3466 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42627 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z m -1.464033,47.81278 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="976.1944"
cx="33.873478"
id="path4212-4"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="976.1944"
cx="66.082214"
id="path4214-4"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="992.26056"
cx="50.107792"
id="path4216-6"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4224-1"
d="m 46.923963,1001.6034 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8921 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4944 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1022.5583"
cx="66.082214"
id="path4231-2"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path5232"
d="m 56.19531,1009.3864 a 5.5,5.5 0 0 0 -0.44531,0.2266 5.5,5.5 0 0 0 -2.01367,7.5137 5.5,5.5 0 0 0 3.18945,2.5117 L 56,1037.8767 l 2,2 1,0 2,-2 -0.91211,-18.2403 a 5.5,5.5 0 0 0 1.16211,-0.4961 5.5,5.5 0 0 0 2.01367,-7.5136 5.5,5.5 0 0 0 -0.27344,-0.42 l -1.70898,0.9864 -0.23242,3.5996 -4.96485,-0.5996 1.09961,-4.0977 -0.98828,-1.709 z"
style="fill:#7f7fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,345 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100"
height="100"
viewBox="0 0 100 100"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-partition.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-8"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-2">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-3"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-9">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-9"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-7"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-1">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-7"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-1">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-3"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4955">
<rect
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4957"
width="60"
height="25"
x="20"
y="990.36218"
ry="2.99998" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4962">
<circle
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4964"
cx="50"
cy="44.000023"
r="15" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999999"
inkscape:cx="42.0625"
inkscape:cy="58.187501"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
guidetolerance="10000"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4136" />
<sodipodi:guide
position="15,35"
orientation="1,0"
id="guide4140"
inkscape:locked="false" />
<sodipodi:guide
position="30,15"
orientation="0,1"
id="guide4142"
inkscape:locked="false" />
<sodipodi:guide
position="85,35"
orientation="1,0"
id="guide4144"
inkscape:locked="false" />
<sodipodi:guide
position="30,80"
orientation="0,1"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="20,60"
orientation="1,0"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="40,20"
orientation="0,1"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="80,60"
orientation="1,0"
id="guide4152"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0,1"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="-0.70710678,0.70710678"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0.70710678,0.70710678"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="50,25"
orientation="1,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="29,44"
orientation="1,0"
id="guide4366"
inkscape:locked="false" />
<sodipodi:guide
position="71,45"
orientation="1,0"
id="guide4368"
inkscape:locked="false" />
<sodipodi:guide
position="57,39"
orientation="0,1"
id="guide4370"
inkscape:locked="false" />
<sodipodi:guide
position="55,81"
orientation="0,1"
id="guide4372"
inkscape:locked="false" />
<sodipodi:guide
position="257,55"
orientation="1,0"
id="guide5234"
inkscape:locked="false" />
<sodipodi:guide
position="268,52"
orientation="1,0"
id="guide5236"
inkscape:locked="false" />
<sodipodi:guide
position="263,61"
orientation="0,1"
id="guide5238"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-952.36216)">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -600,752.36216 v 0"
id="path4763"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<g
id="g4245">
<path
sodipodi:nodetypes="cccccc"
clip-path="none"
inkscape:connector-curvature="0"
id="path4358"
d="m 50.069731,992.22287 4.173285,-14.85174 6.032253,3.40594 3.129676,3.8804 1.892239,5.02944 z"
style="fill:#7f3fbf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
clip-path="none"
inkscape:connector-curvature="0"
id="path4360"
d="m 50.069731,992.22287 2.703126,-15.29368 -7.735134,0.77166 -6.459631,4.27641 z"
style="fill:#a9a9ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccccccc"
clip-path="none"
inkscape:connector-curvature="0"
id="path4362"
d="m 50.069731,992.22287 -12.652439,-9.25298 -2.763542,7.97482 1.867907,8.92677 3.614983,3.98742 9.242206,3.7461 7.7161,-1.7847 z"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
clip-path="none"
inkscape:connector-curvature="0"
id="path4364"
d="m 50.069731,992.22287 8.583763,12.91413 5.566808,-6.41455 1.281631,-7.31544 z"
style="fill:#ff8585;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 49.977845,976.19447 a 16.10437,15.937576 0 0 0 -16.104273,15.93747 16.10437,15.937576 0 0 0 16.104273,15.93746 16.10437,15.937576 0 0 0 16.104274,-15.93746 16.10437,15.937576 0 0 0 -16.104274,-15.93747 z m 0.09188,1.47908 A 14.701592,14.549327 0 0 1 64.771322,992.22288 14.701592,14.549327 0 0 1 50.06973,1006.7722 14.701592,14.549327 0 0 1 35.368138,992.22288 14.701592,14.549327 0 0 1 50.06973,977.67355 Z"
id="path4205-5"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="rect4196-3"
d="m 35.171664,970.39889 c -3.963674,0 -7.154321,3.1576 -7.154321,7.08022 l 0,43.79439 c 0,3.9227 3.190647,7.0802 7.154321,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.79439 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46617 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3466 -4.392102,-4.3466 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42627 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z m -1.464033,47.81278 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="976.1944"
cx="33.873478"
id="path4212-4"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="976.1944"
cx="66.082214"
id="path4214-4"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="992.26056"
cx="50.107792"
id="path4216-6"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4224-1"
d="m 46.923963,1001.6034 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8921 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4944 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1022.5583"
cx="66.082214"
id="path4231-2"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,420 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100"
height="100"
viewBox="0 0 100 100"
id="svg2"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-replace-os.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-8"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-2">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-3"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-9">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-9"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4382-6">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4384-7"
cx="50"
cy="992.86218"
rx="21"
ry="21.500023" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4394-1">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4396-7"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4388-6">
<circle
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4390-1"
cx="50"
cy="992.36218"
r="21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4376-1">
<ellipse
style="opacity:1;fill:#67a100;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="ellipse4378-3"
cx="50"
cy="992.86218"
rx="21"
ry="20.5" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4955">
<rect
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4957"
width="60"
height="25"
x="20"
y="990.36218"
ry="2.99998" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4962">
<circle
style="opacity:1;fill:#f33600;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="circle4964"
cx="50"
cy="44.000023"
r="15" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="68.368387"
inkscape:cy="32.040776"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
guidetolerance="10000"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
objecttolerance="50"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-global="false"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4136" />
<sodipodi:guide
position="15,35"
orientation="1,0"
id="guide4140"
inkscape:locked="false" />
<sodipodi:guide
position="85,30"
orientation="1,0"
id="guide4144"
inkscape:locked="false" />
<sodipodi:guide
position="30,80"
orientation="0,1"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="20,60"
orientation="1,0"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="40,20"
orientation="0,1"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="80,60"
orientation="1,0"
id="guide4152"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0,1"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="-0.70710678,0.70710678"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="50,50"
orientation="0.70710678,0.70710678"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="50,25"
orientation="1,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="29,44"
orientation="1,0"
id="guide4366"
inkscape:locked="false" />
<sodipodi:guide
position="71,45"
orientation="1,0"
id="guide4368"
inkscape:locked="false" />
<sodipodi:guide
position="57,39"
orientation="0,1"
id="guide4370"
inkscape:locked="false" />
<sodipodi:guide
position="257,55"
orientation="1,0"
id="guide5234"
inkscape:locked="false" />
<sodipodi:guide
position="268,52"
orientation="1,0"
id="guide5236"
inkscape:locked="false" />
<sodipodi:guide
position="263,61"
orientation="0,1"
id="guide5238"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-952.36216)">
<path
style="opacity:1;fill:#ff8585;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 35.360435,1006.5426 c 3,-5.0001 3.552535,-2.3323 3.271185,-8.78269 -0.271185,-6.21733 -0.271185,-4.21733 -3.271185,-8.21733 l -8.515115,8.21733 z"
id="path4971-1-6-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccc" />
<path
style="fill:#7f7fff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m -600,752.36216 v 0"
id="path4763"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0" />
<g
id="g4568"
transform="matrix(0.78550119,0,0,0.79372033,-5.340306,202.88184)">
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 40.853284,985.33496 a 16.10437,15.937576 0 0 0 -16.104273,15.93744 16.10437,15.937576 0 0 0 16.104273,15.9375 16.10437,15.937576 0 0 0 16.104274,-15.9375 16.10437,15.937576 0 0 0 -16.104274,-15.93744 z m 0.09188,1.47908 a 14.701592,14.549327 0 0 1 14.701597,14.54936 14.701592,14.549327 0 0 1 -14.701592,14.5493 14.701592,14.549327 0 0 1 -14.701592,-14.5493 14.701592,14.549327 0 0 1 14.701592,-14.54936 z"
id="path4205-5-8-4"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="rect4196-3-2-6"
d="m 26.047103,979.53938 c -3.963674,0 -7.154322,3.1576 -7.154322,7.08022 l 0,43.7945 c 0,3.9227 3.190648,7.0802 7.154322,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.7945 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46628 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3467 -4.392102,-4.3467 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42628 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z M 24.748916,1030.25 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="24.748913"
id="path4212-4-9-5"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="56.957657"
id="path4214-4-5-2"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1001.401"
cx="40.983227"
id="path4216-6-6-3"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4224-1-5-6"
d="m 37.799402,1010.7439 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8922 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4945 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1031.6989"
cx="56.957657"
id="path4231-2-9-5"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
id="g4568-5"
transform="matrix(0.78550119,0,0,0.79372033,41.159698,202.88185)">
<path
style="opacity:1;fill:#7f3fbf;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 51.992667,1012.2965 c 3.819218,-6.2995 4.522635,-2.9384 4.164456,-11.0652 -0.345238,-7.83315 -0.345238,-5.31337 -4.164456,-10.35293 l -10.840359,10.35293 z"
id="path4971-1-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccc" />
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 40.853284,985.33496 a 16.10437,15.937576 0 0 0 -16.104273,15.93744 16.10437,15.937576 0 0 0 16.104273,15.9375 16.10437,15.937576 0 0 0 16.104274,-15.9375 16.10437,15.937576 0 0 0 -16.104274,-15.93744 z m 0.09188,1.47908 a 14.701592,14.549327 0 0 1 14.701597,14.54936 14.701592,14.549327 0 0 1 -14.701592,14.5493 14.701592,14.549327 0 0 1 -14.701592,-14.5493 14.701592,14.549327 0 0 1 14.701592,-14.54936 z"
id="path4205-5-8-4-1"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="rect4196-3-2-6-3"
d="m 26.047103,979.53938 c -3.963674,0 -7.154322,3.1576 -7.154322,7.08022 l 0,43.7945 c 0,3.9227 3.190648,7.0802 7.154322,7.0802 l 29.612365,0 c 3.963674,0 7.154321,-3.1575 7.154321,-7.0802 l 0,-43.7945 c 0,-3.92262 -3.190647,-7.08022 -7.154321,-7.08022 l -29.612365,0 z m 0.165846,2.89773 29.280672,0 c 2.433205,0 4.392101,1.93861 4.392101,4.34661 l 0,43.46628 c 0,2.408 -1.958896,4.3466 -4.392101,4.3466 l -14.640336,0 0,-5.7956 -4.3921,0 -5.856134,0 c -4.392102,0 -4.392102,-4.3467 -4.392102,-4.3467 l 0,-7.2443 -1.464033,0 -2.928068,0 0,-30.42628 c 0,-2.408 1.958896,-4.34661 4.392101,-4.34661 z M 24.748916,1030.25 a 1.4640336,1.4488705 0 0 1 1.464033,1.4488 1.4640336,1.4488705 0 0 1 -1.464033,1.4489 1.4640336,1.4488705 0 0 1 -1.464034,-1.4489 1.4640336,1.4488705 0 0 1 1.464034,-1.4488 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="24.748913"
id="path4212-4-9-5-9"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="985.33484"
cx="56.957657"
id="path4214-4-5-2-6"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1001.401"
cx="40.983227"
id="path4216-6-6-3-3"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4224-1-5-6-7"
d="m 37.799402,1010.7439 a 1.6604496,1.6432522 0 0 0 -1.343936,0.6763 l -8.784201,8.6734 0,2.9175 0,1.4489 0.0057,0 a 2.9280672,2.897741 0 0 0 2.922357,2.8922 l 0,0.01 1.464034,0 2.936644,0 4.389242,-14.4945 -0.0029,0 a 1.6604496,1.6432522 0 0 0 0.07149,-0.4753 1.6604496,1.6432522 0 0 0 -1.658476,-1.6414 z"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<ellipse
ry="1.4488705"
rx="1.4640336"
cy="1031.6989"
cx="56.957657"
id="path4231-2-9-5-0"
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#7f7fff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 55,1002.3622 -4,-5.00004 0,3.00004 -6,0 0,4 6,0 0,3 z"
id="path4542"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="22"
height="22"
id="svg3813"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="partition-table.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3815" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="8.203125"
inkscape:cy="11.046875"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="false"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4109" />
<sodipodi:guide
position="2.0000072,19.999993"
orientation="18,0"
id="guide4115"
inkscape:locked="false" />
<sodipodi:guide
position="2.0000072,1.9999929"
orientation="0,18"
id="guide4117"
inkscape:locked="false" />
<sodipodi:guide
position="20.000007,1.9999929"
orientation="-18,0"
id="guide4119"
inkscape:locked="false" />
<sodipodi:guide
position="20.000007,19.999993"
orientation="0,-18"
id="guide4121"
inkscape:locked="false" />
<sodipodi:guide
position="3.0000072,18.999993"
orientation="16,0"
id="guide4123"
inkscape:locked="false" />
<sodipodi:guide
position="3.0000072,2.9999929"
orientation="0,16"
id="guide4125"
inkscape:locked="false" />
<sodipodi:guide
position="19.000007,2.9999929"
orientation="-16,0"
id="guide4127"
inkscape:locked="false" />
<sodipodi:guide
position="19.000007,18.999993"
orientation="0,-16"
id="guide4129"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata3818">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-378.85714,-540.07647)">
<path
inkscape:connector-curvature="0"
style="color:#000000;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 389.85714,543.07647 c -4.432,0 -8,3.568 -8,8 0,4.432 3.568,8 8,8 4.432,0 8,-3.568 8,-8 0,-4.432 -3.568,-8 -8,-8 z m 0,1 c 3.878,0 7,3.122 7,7 0,3.878 -3.122,7 -7,7 -3.878,0 -7,-3.122 -7,-7 0,-3.878 3.122,-7 7,-7 z"
id="rect4185" />
<path
inkscape:connector-curvature="0"
style="color:#000000;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 389.85714,547.07647 c -2.216,0 -4,1.784 -4,4 0,2.216 1.784,4 4,4 2.216,0 4,-1.784 4,-4 0,-2.216 -1.784,-4 -4,-4 z m 0,1 c 0.46399,0 0.89764,0.11233 1.28906,0.29883 0.18113,-0.1837 0.43139,-0.29883 0.71094,-0.29883 0.554,0 1,0.446 1,1 0,0.27955 -0.11513,0.52981 -0.29883,0.71094 0.18651,0.39142 0.29883,0.82507 0.29883,1.28906 0,1.662 -1.338,3 -3,3 -1.662,0 -3,-1.338 -3,-3 0,-1.662 1.338,-3 3,-3 z"
id="rect4225" />
<path
inkscape:connector-curvature="0"
style="color:#000000;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#7f7fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 391.85714,547.07647 c -1.108,0 -2,0.892 -2,2 0,1.108 0.892,2 2,2 1.108,0 2,-0.892 2,-2 0,-1.108 -0.892,-2 -2,-2 z m 0,1 c 0.554,0 1,0.446 1,1 0,0.554 -0.446,1 -1,1 -0.554,0 -1,-0.446 -1,-1 0,-0.554 0.446,-1 1,-1 z"
id="rect4230" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

109
data/images/release.svg Normal file
View File

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="22"
height="22"
id="svg18109"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="release.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs18111" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="35.509614"
inkscape:cx="-9.7297594"
inkscape:cy="11.926348"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="false"
showguides="true"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4122" />
<sodipodi:guide
position="3,3.0000174"
orientation="-16,0"
id="guide4126"
inkscape:locked="false" />
<sodipodi:guide
position="3,19.000017"
orientation="0,16"
id="guide4128"
inkscape:locked="false" />
<sodipodi:guide
position="19,19.000017"
orientation="16,0"
id="guide4130"
inkscape:locked="false" />
<sodipodi:guide
position="19,3.0000174"
orientation="0,-16"
id="guide4132"
inkscape:locked="false" />
<sodipodi:guide
position="2,2.0000174"
orientation="-18,0"
id="guide4134"
inkscape:locked="false" />
<sodipodi:guide
position="2,20.000017"
orientation="0,18"
id="guide4136"
inkscape:locked="false" />
<sodipodi:guide
position="20,20.000017"
orientation="18,0"
id="guide4138"
inkscape:locked="false" />
<sodipodi:guide
position="20,2.0000174"
orientation="0,-18"
id="guide4140"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata18114">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<path
style="opacity:1;fill:#7f7fff;fill-opacity:1;stroke:none;stroke-width:2.79999995;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.55026455"
d="M 3 3 L 3 4 L 3 18 L 3 19 L 4 19 L 19 19 L 19 18 L 19 3 L 4 3 L 3 3 z M 4 4 L 18 4 L 18 18 L 4 18 L 4 4 z M 11 6 L 9.453125 9.2910156 L 6 9.8183594 L 8.5 12.380859 L 7.9101562 16 L 11 14.291016 L 14.089844 16 L 13.5 12.380859 L 16 9.8183594 L 12.546875 9.2910156 L 11 6 z "
transform="translate(0,1030.3622)"
id="rect4148" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
data/images/squid.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

341
data/images/squid.svg Normal file
View File

@ -0,0 +1,341 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
id="svg5453"
version="1.1"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="squid.svg"
inkscape:export-filename="/home/jamboarder/Projects/KDE VDG/Calamares/calamares-icon-2.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs5455">
<linearGradient
id="linearGradient5623">
<stop
id="stop5625"
offset="0"
style="stop-color:#7f3fbf;stop-opacity:1;" />
<stop
style="stop-color:#030332;stop-opacity:1;"
offset="1"
id="stop5627" />
</linearGradient>
<linearGradient
id="linearGradient3819">
<stop
style="stop-color:#eff0f1;stop-opacity:1;"
offset="0"
id="stop3821" />
<stop
style="stop-color:#bdc3c7;stop-opacity:1;"
offset="1"
id="stop3823" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3819"
id="linearGradient3825"
x1="24"
y1="20"
x2="24"
y2="43.999973"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(384.57143,499.798)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4227"
id="linearGradient3843"
x1="10"
y1="36"
x2="15"
y2="41"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(384.57143,500.798)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4227"
id="linearGradient3847"
gradientUnits="userSpaceOnUse"
x1="9.9047623"
y1="36"
x2="14.90477"
y2="41.000008"
gradientTransform="translate(398.66666,500.798)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5623"
id="linearGradient3948"
x1="25.065147"
y1="33.843651"
x2="25"
y2="10"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.0833332,384.57143,492.96467)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4227"
id="linearGradient3080"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3793103,0,0,1.3793103,384.81281,499.0393)"
x1="8.5250006"
y1="7.8000579"
x2="25.200001"
y2="25.200058" />
<linearGradient
id="linearGradient4227"
inkscape:collect="always">
<stop
id="stop4229"
offset="0"
style="stop-color:#292c2f;stop-opacity:1" />
<stop
id="stop4231"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="10.854086"
inkscape:cx="-3.0863953"
inkscape:cy="18.840831"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:showpageshadow="false"
borderlayer="true"
showguides="true"
inkscape:snap-global="true"
inkscape:snap-nodes="true"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:object-nodes="true"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid4063"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
<sodipodi:guide
position="1.1650391e-05,47.999996"
orientation="4,0"
id="guide4146"
inkscape:locked="false" />
<sodipodi:guide
position="1.1650391e-05,43.999996"
orientation="0,48"
id="guide4148"
inkscape:locked="false" />
<sodipodi:guide
position="48.000012,43.999996"
orientation="-4,0"
id="guide4150"
inkscape:locked="false" />
<sodipodi:guide
position="1.1650391e-05,4.0000264"
orientation="4,0"
id="guide4154"
inkscape:locked="false" />
<sodipodi:guide
position="1.1650391e-05,2.6367188e-05"
orientation="0,48"
id="guide4156"
inkscape:locked="false" />
<sodipodi:guide
position="48.000012,2.6367188e-05"
orientation="-4,0"
id="guide4158"
inkscape:locked="false" />
<sodipodi:guide
position="48.000012,4.0000264"
orientation="0,-48"
id="guide4160"
inkscape:locked="false" />
<sodipodi:guide
position="48.000012,48.000026"
orientation="0,-4"
id="guide4162"
inkscape:locked="false" />
<sodipodi:guide
position="44.000012,48.000026"
orientation="48,0"
id="guide4164"
inkscape:locked="false" />
<sodipodi:guide
position="44.000012,2.6367188e-05"
orientation="0,4"
id="guide4166"
inkscape:locked="false" />
<sodipodi:guide
position="48.000012,2.6367188e-05"
orientation="-48,0"
id="guide4168"
inkscape:locked="false" />
<sodipodi:guide
position="4.0000422,48.000026"
orientation="0,-4"
id="guide4170"
inkscape:locked="false" />
<sodipodi:guide
position="4.2167969e-05,48.000026"
orientation="48,0"
id="guide4172"
inkscape:locked="false" />
<sodipodi:guide
position="4.2167969e-05,2.6367188e-05"
orientation="0,4"
id="guide4174"
inkscape:locked="false" />
<sodipodi:guide
position="4.0000422,2.6367188e-05"
orientation="-48,0"
id="guide4176"
inkscape:locked="false" />
<sodipodi:guide
position="4.0000117,47.999996"
orientation="43.999969,0"
id="guide4638"
inkscape:locked="false" />
<sodipodi:guide
position="4.0000117,4.0000264"
orientation="0,20"
id="guide4640"
inkscape:locked="false" />
<sodipodi:guide
position="24.000012,47.999996"
orientation="0,-20"
id="guide4644"
inkscape:locked="false" />
<sodipodi:guide
position="4.0000422,24.000026"
orientation="20,0"
id="guide4666"
inkscape:locked="false" />
<sodipodi:guide
position="4.0000422,4.0000264"
orientation="0,39.999969"
id="guide4668"
inkscape:locked="false" />
<sodipodi:guide
position="44.000012,4.0000264"
orientation="-20,0"
id="guide4670"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5458">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-384.57143,-499.798)">
<rect
style="fill:url(#linearGradient3948);fill-opacity:1;stroke:none"
id="rect3936"
width="32"
height="25.999996"
x="392.57144"
y="503.798"
ry="0" />
<path
style="opacity:0.2;fill:#232629;fill-opacity:1;stroke:none"
d="m 408.57143,533.798 c -1.662,0 -3,1.338 -3,3 0,1.662 1.338,3 3,3 1.30536,0 2.39817,-0.84052 2.8125,-2 l 8.375,0 c 0.41433,1.15948 1.50714,2 2.8125,2 1.662,0 3,-1.338 3,-3 0,-1.662 -1.338,-3 -3,-3 -1.30536,0 -2.39817,0.84052 -2.8125,2 l -8.375,0 c -0.41433,-1.15948 -1.50714,-2 -2.8125,-2 z"
id="path3911"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient3825);fill-opacity:1;stroke:none"
d="m 388.57144,529.798 -10e-6,14 40,0 10e-6,-14 z"
id="rect3804"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
inkscape:connector-curvature="0"
id="path3829"
d="m 411.38393,537.798 8.375,0 c 0.41433,1.15948 1.50714,2 2.8125,2 1.662,0 3,-1.338 3,-3 0,-1.662 -1.338,-3 -3,-3 -1.30536,0 -2.39817,0.84052 -2.8125,2 l -8.375,0 c 0.1875,1 0.1875,1 0,2 z"
style="opacity:0.77876108;fill:#4d4d4d;fill-opacity:1;stroke:none"
sodipodi:nodetypes="ccsssccc" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path3845"
d="m 406.66666,539.13133 4.76191,4.66667 8.14286,0 -9.14286,-9.42857 z"
style="opacity:0.2;fill:url(#linearGradient3847);fill-opacity:1.0;stroke:none" />
<path
style="opacity:0.2;fill:url(#linearGradient3843);fill-opacity:1.0;stroke:none"
d="m 392.57143,539.13133 4.61905,4.66667 13.38095,0 -4.86671,-6.9365 -7.13329,-0.0675 -2.23809,-2.42461 z"
id="path3835"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
<path
style="fill:#7f3fbf;fill-opacity:1;stroke:none"
d="m 394.57143,533.798 c -1.662,0 -3,1.338 -3,3 0,1.662 1.338,3 3,3 1.30536,0 2.39817,-0.84052 2.8125,-2 l 8.375,0 c 0.41433,1.15948 1.50714,2 2.8125,2 1.662,0 3,-1.338 3,-3 0,-1.662 -1.338,-3 -3,-3 -1.30536,0 -2.39817,0.84052 -2.8125,2 l -8.375,0 c -0.41433,-1.15948 -1.50714,-2 -2.8125,-2 z"
id="rect3812"
inkscape:connector-curvature="0" />
<rect
ry="0"
y="542.79797"
x="388.57147"
height="0.99997008"
width="39.999954"
id="rect3827"
style="fill:#95a5a6;fill-opacity:1;stroke:none" />
<rect
style="fill:#eff0f1;fill-opacity:1;stroke:none"
id="rect3855"
width="39.999969"
height="1.0000263"
x="388.57147"
y="529.79797"
ry="0" />
<path
inkscape:connector-curvature="0"
style="opacity:0.2;fill:url(#linearGradient3080);fill-opacity:1;fill-rule:evenodd;stroke:none"
d="m 409.57143,513.798 0,1 -1,9 20.00001,19 0,0 0,0 -10e-6,-1 10e-6,-13 -19.00001,-19 z"
id="path4184"
sodipodi:nodetypes="cccccccccc" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#fcfcfc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 407.57143,509.798 0,10 -4.5,-4.5 -1.5,1.5 7,7 7,-7 -1.5,-1.5 -4.5,4.5 0,-10 -2,0 z"
id="path3938"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

50
data/images/state-ok.svg Normal file
View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 8 8"
version="1.1"
id="svg3215"
sodipodi:docname="state-ok.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview3217"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="112.25"
inkscape:cx="2.2227171"
inkscape:cy="4.0044543"
inkscape:window-width="1920"
inkscape:window-height="1236"
inkscape:window-x="1080"
inkscape:window-y="404"
inkscape:window-maximized="0"
inkscape:current-layer="svg3215" />
<defs
id="defs3051">
<style
type="text/css"
id="current-color-scheme">
.ColorScheme-PositiveText {
color:#27ae60;
}
</style>
</defs>
<path
style="fill:#7f3fbf;fill-opacity:1;stroke:none"
class="ColorScheme-PositiveText"
d="M 4 0 C 1.784 0 0 1.784 0 4 C 0 6.216 1.784 8 4 8 C 6.216 8 8 6.216 8 4 C 8 1.784 6.216 0 4 0 z "
id="path3211" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none"
d="M 6 2 L 3 5 L 2 4 L 1 5 L 2 6 L 3 7 L 7 3 L 6 2 z "
id="path3213" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
data/images/yes.svgz Normal file

Binary file not shown.

5
git_check_version.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
printf "3.3.0.%s\n" "$(git rev-list --count HEAD)"
echo "Ready"

6
git_push.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash
git add . && git commit -m "Update"
git push --force
echo "Ready"

5
git_status.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
git status
echo "Ready"

64
lang_xml_en_correct.py Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/env python3
with open("lang/calamares_en.ts") as lang:
result = []
for line in lang:
if '<TS version="2.1" language="en">' in line:
line = f'<TS language="en" version="2.1">\n'
if '<TS version="2.1" language="ru">' in line:
line = f'<TS language="ru" version="2.1">\n'
if "<context" in line:
line = f' {line.lstrip()}'
if "</context" in line:
line = f' {line.lstrip()}'
if "<location" in line:
line = f' {line.lstrip()}'
if "<source" in line:
line = f' {line.lstrip()}'
if "</source" in line:
line = f' {line.lstrip()}'
if "<comment" in line:
line = f' {line.lstrip()}'
if "<extracomment" in line:
line = f' {line.lstrip()}'
if "<translation" in line:
line = f' {line.lstrip()}'
if "</translation" in line:
line = f' {line.lstrip()}'
if "<translatorcomment" in line:
line = f' {line.lstrip()}'
if "<numerusform" in line:
line = f' {line.lstrip()}'
line = line.replace("&quot;", '"')
line = line.replace("&apos;", "'")
# <context - 2 пробела
# </context - 2 пробела
# <location - 6 пробелов
# <source - 6 пробелов
# <comment - 6 пробелов
# <extracomment - 6 пробелов
# <translation - 6 пробелов
# <numerusform - 8 пробелов
result.append(line)
if result.__len__() > 0:
with open("lang/calamares_en_mod.ts", mode = "wt+") as lang_mod:
lang_mod.writelines(result)

64
lang_xml_ru_correct.py Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/env python3
with open("lang/calamares_ru.ts") as lang:
result = []
for line in lang:
if '<TS version="2.1" language="en">' in line:
line = f'<TS language="en" version="2.1">\n'
if '<TS version="2.1" language="ru">' in line:
line = f'<TS language="ru" version="2.1">\n'
if "<context" in line:
line = f' {line.lstrip()}'
if "</context" in line:
line = f' {line.lstrip()}'
if "<location" in line:
line = f' {line.lstrip()}'
if "<source" in line:
line = f' {line.lstrip()}'
if "</source" in line:
line = f' {line.lstrip()}'
if "<comment" in line:
line = f' {line.lstrip()}'
if "<extracomment" in line:
line = f' {line.lstrip()}'
if "<translation" in line:
line = f' {line.lstrip()}'
if "</translation" in line:
line = f' {line.lstrip()}'
if "<translatorcomment" in line:
line = f' {line.lstrip()}'
if "<numerusform" in line:
line = f' {line.lstrip()}'
line = line.replace("&quot;", '"')
line = line.replace("&apos;", "'")
# <context - 2 пробела
# </context - 2 пробела
# <location - 6 пробелов
# <source - 6 пробелов
# <comment - 6 пробелов
# <extracomment - 6 пробелов
# <translation - 6 пробелов
# <numerusform - 8 пробелов
result.append(line)
if result.__len__() > 0:
with open("lang/calamares_ru_mod.ts", mode = "wt+") as lang_mod:
lang_mod.writelines(result)

138
settings.conf Normal file
View File

@ -0,0 +1,138 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Configuration file for Melawy Linux Calamares online installs
---
modules-search: [ local ]
instances:
- id: online
module: packages
config: packages_online.conf
- id: online
module: welcome
config: welcome_online.conf
# - shellprocess_copy_packages_dont_chroot
- id: copy_packages_dont_chroot
module: shellprocess
config: shellprocess_copy_packages_dont_chroot.conf
# - shellprocess@initialize_pacman_dont_chroot
- id: initialize_pacman_dont_chroot
module: shellprocess
config: shellprocess_initialize_pacman_dont_chroot_online.conf
# - shellprocess@remove_ucode_chrooted
- id: remove_ucode_chrooted
module: shellprocess
config: shellprocess_remove_ucode_chrooted.conf
# - shellprocess@copy_refind_theme_chrooted
- id: copy_refind_theme_chrooted
module: shellprocess
config: shellprocess_copy_refind_theme_chrooted.conf
# - shellprocess@remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
- id: remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
module: shellprocess
config: shellprocess_remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted.conf
# - shellprocess@build_dracut_kernels_and_menu_chrooted
- id: build_dracut_kernels_and_menu_chrooted
module: shellprocess
config: shellprocess_build_dracut_kernels_and_menu_chrooted.conf
# - shellprocess@final_chrooted
- id: final_chrooted
module: shellprocess
config: shellprocess_final_chrooted.conf
# - shellprocess@copy_pacman_std_conf_dont_chroot
- id: copy_pacman_std_conf_dont_chroot
module: shellprocess
config: shellprocess_copy_pacman_std_conf_dont_chroot.conf
# - shellprocess@copy_install_logs_dont_chroot
- id: copy_install_logs_dont_chroot
module: shellprocess
config: shellprocess_copy_install_logs_dont_chroot.conf
# - shellprocess@install_nvidia_drivers_chrooted
- id: install_nvidia_drivers_chrooted
module: shellprocess
config: shellprocess_install_nvidia_drivers_chrooted.conf
# - shellprocess@install_intel_drivers_chrooted
- id: install_intel_drivers_chrooted
module: shellprocess
config: shellprocess_install_intel_drivers_chrooted.conf
sequence:
- show:
- welcome@online
- locale
- keyboard
# - packagechooser
- netinstall
- packagechooserq
- partition
- users
- summary
- exec:
- hardwaredetect
- partition
- zfs
- mount
- shellprocess@copy_packages_dont_chroot
- shellprocess@initialize_pacman_dont_chroot
- pacstrap
- machineid
- fstab
- locale
- keyboard
- localecfg
- userpkglist
- packages@online
- luksbootkeyfile
- zfshostid
- users
- networkcfg
- displaymanager
- hwclock
- shellprocess@remove_ucode_chrooted
- eos_bootloader
- grubcfg
- bootloader
- services-systemd
- shellprocess@copy_refind_theme_chrooted
- shellprocess@install_nvidia_drivers_chrooted
- shellprocess@install_intel_drivers_chrooted
- shellprocess@remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
- shellprocess@build_dracut_kernels_and_menu_chrooted
- shellprocess@final_chrooted
- shellprocess@copy_pacman_std_conf_dont_chroot
- shellprocess@copy_install_logs_dont_chroot
- preservefiles
- umount
- show:
- finished
branding: melawy
prompt-install: true
dont-chroot: false
oem-setup: false
disable-cancel: false
disable-cancel-during-exec: false
hide-back-and-next-during-exec: true
quit-at-end: false

133
settings_offline.conf Normal file
View File

@ -0,0 +1,133 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Configuration file for Melawy Linux offline installs
---
modules-search: [ local ]
instances:
- id: offline
module: packages
config: packages_offline.conf
- id: offline
module: welcome
config: welcome_offline.conf
- id: offline
module: eos_bootloader
config: eos_bootloader_offline.conf
# - shellprocess@reset_systemd_multiuser_chrooted
- id: reset_systemd_multiuser_chrooted
module: shellprocess
config: shellprocess_reset_systemd_multiuser_chrooted.conf
# - shellprocess@initialize_pacman_dont_chroot
- id: initialize_pacman_dont_chroot
module: shellprocess
config: shellprocess_initialize_pacman_dont_chroot_offline.conf
# - shellprocess@remove_ucode_chrooted
- id: remove_ucode_chrooted
module: shellprocess
config: shellprocess_remove_ucode_chrooted.conf
# - shellprocess@copy_refind_theme_chrooted
- id: copy_refind_theme_chrooted
module: shellprocess
config: shellprocess_copy_refind_theme_chrooted.conf
# - shellprocess@remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
- id: remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
module: shellprocess
config: shellprocess_remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted.conf
# - shellprocess@build_dracut_kernels_and_menu_chrooted
- id: build_dracut_kernels_and_menu_chrooted
module: shellprocess
config: shellprocess_build_dracut_kernels_and_menu_chrooted.conf
# - shellprocess@final_chrooted
- id: final_chrooted
module: shellprocess
config: shellprocess_final_chrooted.conf
# - shellprocess@copy_pacman_std_conf_dont_chroot
- id: copy_pacman_std_conf_dont_chroot
module: shellprocess
config: shellprocess_copy_pacman_std_conf_dont_chroot.conf
# - shellprocess@copy_install_logs_dont_chroot
- id: copy_install_logs_dont_chroot
module: shellprocess
config: shellprocess_copy_install_logs_dont_chroot.conf
# - shellprocess@install_intel_drivers_chrooted
- id: install_intel_drivers_chrooted
module: shellprocess
config: shellprocess_install_intel_drivers_chrooted.conf
sequence:
- show:
- welcome@offline
- locale
- keyboard
- packagechooserq
- partition
- users
- summary
- exec:
- hardwaredetect
- partition
- mount
- unpackfs
- shellprocess@reset_systemd_multiuser_chrooted
- machineid
- fstab
- locale
- keyboard
- localecfg
- luksbootkeyfile
- removeuser
- users
- networkcfg
- displaymanager
- shellprocess@initialize_pacman_dont_chroot
- packages@offline
- hwclock
- shellprocess@remove_ucode_chrooted
- eos_bootloader@offline
- grubcfg
- bootloader
- services-systemd
- shellprocess@copy_refind_theme_chrooted
- shellprocess@install_intel_drivers_chrooted
- shellprocess@remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
- shellprocess@build_dracut_kernels_and_menu_chrooted
- shellprocess@final_chrooted
- shellprocess@copy_pacman_std_conf_dont_chroot
- shellprocess@copy_install_logs_dont_chroot
- preservefiles
- umount
- show:
- finished
branding: melawy
prompt-install: true
dont-chroot: false
oem-setup: false
disable-cancel: false
disable-cancel-during-exec: false
hide-back-and-next-during-exec: true
quit-at-end: false

135
settings_online.conf Normal file
View File

@ -0,0 +1,135 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Configuration file for Melawy Linux Calamares online installs
---
modules-search: [ local ]
instances:
- id: online
module: packages
config: packages_online.conf
- id: online
module: welcome
config: welcome_online.conf
# - shellprocess_copy_packages_dont_chroot
- id: copy_packages_dont_chroot
module: shellprocess
config: shellprocess_copy_packages_dont_chroot.conf
# - shellprocess@initialize_pacman_dont_chroot
- id: initialize_pacman_dont_chroot
module: shellprocess
config: shellprocess_initialize_pacman_dont_chroot_online.conf
# - shellprocess@remove_ucode_chrooted
- id: remove_ucode_chrooted
module: shellprocess
config: shellprocess_remove_ucode_chrooted.conf
# - shellprocess@copy_refind_theme_chrooted
- id: copy_refind_theme_chrooted
module: shellprocess
config: shellprocess_copy_refind_theme_chrooted.conf
# - shellprocess@remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
- id: remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
module: shellprocess
config: shellprocess_remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted.conf
# - shellprocess@build_dracut_kernels_and_menu_chrooted
- id: build_dracut_kernels_and_menu_chrooted
module: shellprocess
config: shellprocess_build_dracut_kernels_and_menu_chrooted.conf
# - shellprocess@final_chrooted
- id: final_chrooted
module: shellprocess
config: shellprocess_final_chrooted.conf
# - shellprocess@copy_pacman_std_conf_dont_chroot
- id: copy_pacman_std_conf_dont_chroot
module: shellprocess
config: shellprocess_copy_pacman_std_conf_dont_chroot.conf
# - shellprocess@copy_install_logs_dont_chroot
- id: copy_install_logs_dont_chroot
module: shellprocess
config: shellprocess_copy_install_logs_dont_chroot.conf
# - shellprocess@install_nvidia_drivers_chrooted
- id: install_nvidia_drivers_chrooted
module: shellprocess
config: shellprocess_install_nvidia_drivers_chrooted.conf
# - shellprocess@install_intel_drivers_chrooted
- id: install_intel_drivers_chrooted
module: shellprocess
config: shellprocess_install_intel_drivers_chrooted.conf
sequence:
- show:
- welcome@online
- locale
- keyboard
# - packagechooser
- netinstall
- packagechooserq
- partition
- users
- summary
- exec:
- hardwaredetect
- partition
- mount
- shellprocess@copy_packages_dont_chroot
- shellprocess@initialize_pacman_dont_chroot
- pacstrap
- machineid
- fstab
- locale
- keyboard
- localecfg
- packages@online
- luksbootkeyfile
- users
- networkcfg
- displaymanager
- hwclock
- shellprocess@remove_ucode_chrooted
- eos_bootloader
- grubcfg
- bootloader
- services-systemd
- shellprocess@copy_refind_theme_chrooted
- shellprocess@install_nvidia_drivers_chrooted
- shellprocess@install_intel_drivers_chrooted
- shellprocess@remove_unneeded_nvidia_and_virt_machine_and_packages_chrooted
- shellprocess@build_dracut_kernels_and_menu_chrooted
- shellprocess@final_chrooted
- shellprocess@copy_pacman_std_conf_dont_chroot
- shellprocess@copy_install_logs_dont_chroot
- preservefiles
- umount
- show:
- finished
branding: melawy
prompt-install: true
dont-chroot: false
oem-setup: false
disable-cancel: false
disable-cancel-during-exec: false
hide-back-and-next-during-exec: true
quit-at-end: false

236
settings_sample.conf Normal file
View File

@ -0,0 +1,236 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Configuration file for Calamares
#
# This is the top-level configuration file for Calamares.
# It specifies what modules will be used, as well as some
# overall characteristics -- is this a setup program, or
# an installer. More specific configuration is devolved
# to the branding file (for the UI) and the individual
# module configuration files (for functionality).
---
# Modules can be job modules (with different interfaces) and QtWidgets view
# modules. They could all be placed in a number of different paths.
# "modules-search" is a list of strings, each of these can either be a full
# path to a directory or the keyword "local".
#
# "local" means:
# - modules in $LIBDIR/calamares/modules, with
# - settings in SHARE/calamares/modules or /etc/calamares/modules.
# In debug-mode (e.g. calamares -d) "local" also adds some paths
# that make sense from inside the build-directory, so that you
# can build-and-run with the latest modules immediately.
#
# Strings other than "local" are taken as paths and interpreted
# relative to wherever Calamares is started. It is therefore **strongly**
# recommended to use only absolute paths here. This is mostly useful
# if your distro has forks of standard Calamares modules, but also
# uses some form of upstream packaging which might overwrite those
# forked modules -- then you can keep modules somewhere outside of
# the "regular" module tree.
#
#
# YAML: list of strings.
modules-search: [ local ]
# Instances section. This section is optional, and it defines custom instances
# for modules of any kind. An instance entry has these keys:
# - *module* name, which matches the module name from the module descriptor
# (usually the name of the directory under `src/modules/`, but third-
# party modules may diverge.
# - *id* (optional) an identifier to distinguish this instance from
# all the others. If none is given, the name of the module is used.
# Together, the module and id form an instance key (see below).
# - *config* (optional) a filename for the configuration. If none is
# given, *module*`.conf` is used (e.g. `welcome.conf` for the welcome
# module)
# - *weight* (optional) In the *exec* phase of the sequence, progress
# is reported as jobs are completed. The jobs from a single module
# together contribute the full weight of that module. The overall
# progress (0 .. 100%) is divided up according to the weight of each
# module. Give modules that take a lot of time to complete, a larger
# weight to keep the overall progress moving along steadily. This
# weight overrides a weight given in the module descriptor. If no weight
# is given, uses the value from the module descriptor, or 1 if there
# isn't one there either.
#
# The primary goal of this mechanism is to allow loading multiple instances
# of the same module, with different configuration. If you don't need this,
# the instances section can safely be left empty.
#
# Module name plus instance name makes an instance key, e.g.
# "packagechooserq@licenseq", where "packagechooserq" is the module name (for the packagechooserq
# viewmodule) and "licenseq" is the instance name. In the *sequence*
# section below, use instance-keys to name instances (instead of just
# a module name, for modules which have only a single instance).
#
# Every module implicitly has an instance with the instance name equal
# to its module name, e.g. "welcome@welcome". In the *sequence* section,
# mentioning a module without a full instance key (e.g. "welcome")
# means that implicit module.
#
# An instance may specify its configuration file (e.g. `webview-home.conf`).
# The implicit instances all have configuration files named `<module>.conf`.
# This (implict) way matches the source examples, where the welcome
# module contains an example `welcome.conf`. Specify a *config* for
# any module (also implicit instances) to change which file is used.
#
# For more information on running module instances, run Calamares in debug
# mode and check the Modules page in the Debug information interface.
#
# A module that is often used with instances is shellprocess, which will
# run shell commands specified in the configuration file. By configuring
# more than one instance of the module, multiple shell sessions can be run
# during install.
#
# YAML: list of maps of string:string key-value pairs.
#instances:
#- id: licenseq
# module: packagechooserq
# config: licenseq.conf
# Sequence section. This section describes the sequence of modules, both
# viewmodules and jobmodules, as they should appear and/or run.
#
# A jobmodule instance key (or name) can only appear in an exec phase, whereas
# a viewmodule instance key (or name) can appear in both exec and show phases.
# There is no limit to the number of show or exec phases. However, the same
# module instance key should not appear more than once per phase, and
# deployers should take notice that the global storage structure is persistent
# throughout the application lifetime, possibly influencing behavior across
# phases. A show phase defines a sequence of viewmodules (and therefore
# pages). These viewmodules can offer up jobs for the execution queue.
#
# An exec phase displays a progress page (with brandable slideshow). This
# progress page iterates over the modules listed in the *immediately
# preceding* show phase, and enqueues their jobs, as well as any other jobs
# from jobmodules, in the order defined in the current exec phase.
#
# It then executes the job queue and clears it. If a viewmodule offers up a
# job for execution, but the module name (or instance key) isn't listed in the
# immediately following exec phase, this job will not be executed.
#
# YAML: list of lists of strings.
sequence:
- show:
- welcome
# - notesqml
# - packagechooserq@licenseq
- locale
- keyboard
- partition
- users
# - tracking
- summary
- exec:
# - dummycpp
# - dummyprocess
# - dummypython
- partition
# - zfs
- mount
- unpackfs
- machineid
- fstab
- locale
- keyboard
- localecfg
# - luksbootkeyfile
# - luksopenswaphookcfg
# - dracutlukscfg
# - plymouthcfg
# - zfshostid
- initcpiocfg
- initcpio
- users
- displaymanager
- networkcfg
- hwclock
- services-systemd
# - dracut
- initramfs
# - grubcfg
- bootloader
- umount
- show:
- finished
# A branding component is a directory, either in SHARE/calamares/branding or
# in /etc/calamares/branding (the latter takes precedence). The directory must
# contain a YAML file branding.desc which may reference additional resources
# (such as images) as paths relative to the current directory.
#
# A branding component can also ship a QML slideshow for execution pages,
# along with translation files.
#
# Only the name of the branding component (directory) should be specified
# here, Calamares then takes care of finding it and loading the contents.
#
# YAML: string.
branding: default
# If this is set to true, Calamares will show an "Are you sure?" prompt right
# before each execution phase, i.e. at points of no return. If this is set to
# false, no prompt is shown. Default is false, but Calamares will complain if
# this is not explicitly set.
#
# YAML: boolean.
prompt-install: false
# If this is set to true, Calamares will execute all target environment
# commands in the current environment, without chroot. This setting should
# only be used when setting up Calamares as a post-install configuration tool,
# as opposed to a full operating system installer.
#
# Some official Calamares modules are not expected to function with this
# setting. (e.g. partitioning seems like a bad idea, since that is expected to
# have been done already)
#
# Default is false (for a normal installer), but Calamares will complain if
# this is not explicitly set.
#
# YAML: boolean.
dont-chroot: false
# If this is set to true, Calamares refers to itself as a "setup program"
# rather than an "installer". Defaults to the value of dont-chroot, but
# Calamares will complain if this is not explicitly set.
oem-setup: false
# If this is set to true, the "Cancel" button will be disabled entirely.
# The button is also hidden from view.
#
# This can be useful if when e.g. Calamares is used as a post-install
# configuration tool and you require the user to go through all the
# configuration steps.
#
# Default is false, but Calamares will complain if this is not explicitly set.
#
# YAML: boolean.
disable-cancel: false
# If this is set to true, the "Cancel" button will be disabled once
# you start the 'Installation', meaning there won't be a way to cancel
# the Installation until it has finished or installation has failed.
#
# Default is false, but Calamares will complain if this is not explicitly set.
#
# YAML: boolean.
disable-cancel-during-exec: false
# If this is set to true, the "Next" and "Back" button will be hidden once
# you start the 'Installation'.
#
# Default is false, but Calamares will complain if this is not explicitly set.
#
# YAML: boolean.
hide-back-and-next-during-exec: false
# If this is set to true, then once the end of the sequence has
# been reached, the quit (done) button is clicked automatically
# and Calamares will close. Default is false: the user will see
# that the end of installation has been reached, and that things are ok.
#
#
quit-at-end: false

View File

@ -0,0 +1,10 @@
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
#
# Add branding components. Since there is only one, called "default",
# add that one. For examples of other branding components, see
# the calamares-extensions repository.
calamares_add_branding_subdirectory( melawy )

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,222 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Product branding information. This influences some global
# user-visible aspects of Calamares, such as the product
# name, window behavior, and the slideshow during installation.
#
# Additional styling can be done using the stylesheet.qss
# file, also in the branding directory.
---
componentName: melawy
### WELCOME / OVERALL WORDING
#
# These settings affect some overall phrasing and looks,
# which are most visible in the welcome page.
# This selects between different welcome texts. When false, uses
# the traditional "Welcome to the %1 installer.", and when true,
# uses "Welcome to the Calamares installer for %1." This allows
# to distinguish this installer from other installers for the
# same distribution.
welcomeStyleCalamares: false
# Should the welcome image (productWelcome, below) be scaled
# up beyond its natural size? If false, the image does not grow
# with the window but remains the same size throughout (this
# may have surprising effects on HiDPI monitors).
welcomeExpandingLogo: true
### WINDOW CONFIGURATION
#
# The settings here affect the placement of the Calamares
# window through hints to the window manager and initial
# sizing of the Calamares window.
# Size and expansion policy for Calamares.
# - "normal" or unset, expand as needed, use *windowSize*
# - "fullscreen", start as large as possible, ignore *windowSize*
# - "noexpand", don't expand automatically, use *windowSize*
windowExpanding: normal
# Size of Calamares window, expressed as w,h. Both w and h
# may be either pixels (suffix px) or font-units (suffix em).
# e.g. "800px,600px"
# "60em,480px"
# This setting is ignored if "fullscreen" is selected for
# *windowExpanding*, above. If not set, use constants defined
# in CalamaresUtilsGui, 800x520.
windowSize: 1200px,715px
# Placement of Calamares window. Either "center" or "free".
# Whether "center" actually works does depend on the window
# manager in use (and only makes sense if you're not using
# *windowExpanding* set to "fullscreen").
windowPlacement: center
### PANELS CONFIGURATION
#
# Calamares has a main content area, and two panels (navigation
# and progress / sidebar). The panels can be controlled individually,
# or switched off. If both panels are switched off, the layout of
# the main content area loses its margins, on the assumption that
# you're doing something special.
# Kind of sidebar (panel on the left, showing progress).
# - "widget" or unset, use traditional sidebar (logo, items)
# - "none", hide it entirely
# - "qml", use calamares-sidebar.qml from branding folder
# In addition, you **may** specify a side, separated by a comma,
# from the kind. Valid sides are:
# - "left" (if not specified, uses this)
# - "right"
# - "top"
# - "bottom"
# For instance, "widget,right" is valid; so is "qml", which defaults
# to putting the sidebar on the left. Also valid is "qml,top".
# While "widget,top" is valid, the widgets code is **not** flexible
# and results will be terrible.
sidebar: qml,top
# Kind of navigation (button panel on the bottom).
# - "widget" or unset, use traditional navigation
# - "none", hide it entirely
# - "qml", use calamares-navigation.qml from branding folder
# In addition, you **may** specify a side, separated by a comma,
# from the kind. The same sides are valid as for *sidebar*,
# except the default is *bottom*.
navigation: widget
### STRINGS, IMAGES AND COLORS
#
# This section contains the "branding proper" of names
# and images, rather than global-look settings.
# These are strings shown to the user in the user interface.
# There is no provision for translating them -- since they
# are names, the string is included as-is.
#
# The four Url strings are the Urls used by the buttons in
# the welcome screen, and are not shown to the user. Clicking
# on the "Support" button, for instance, opens the link supportUrl.
# If a Url is empty, the corresponding button is not shown.
#
# bootloaderEntryName is how this installation / distro is named
# in the boot loader (e.g. in the GRUB menu).
#
# These strings support substitution from /etc/os-release
# if KDE Frameworks 5.58 are available at build-time. When
# enabled, @{var-name} is replaced by the equivalent value
# from os-release. All the supported var-names are in all-caps,
# and are listed on the FreeDesktop.org site,
# https://www.freedesktop.org/software/systemd/man/os-release.html
# Note that ANSI_COLOR and CPE_NAME don't make sense here, and
# are not supported (the rest are). Remember to quote the string
# if it contains substitutions, or you'll get YAML exceptions.
#
# The *Url* entries are used on the welcome page, and they
# are visible as buttons there if the corresponding *show* keys
# are set to "true" (they can also be overridden).
strings:
productName: Melawy Linux
shortProductName: Melawy Linux
version: ${release_name} ${version}
shortVersion: ${version}
versionedName: Melawy Linux
shortVersionedName: ${release_name}
bootloaderEntryName: Melawy Linux
productUrl: https://melawy.ru/
supportUrl: https://melawy.ru/
releaseNotesUrl: https://melawy.ru
# These images are loaded from the branding module directory.
#
# productBanner is an optional image, which if present, will be shown
# on the welcome page of the application, above the welcome text.
# It is intended to have a width much greater than height.
# It is displayed at 64px height (also on HiDPI).
# Recommended size is 64px tall, and up to 460px wide.
# productIcon is used as the window icon, and will (usually) be used
# by the window manager to represent the application. This image
# should be square, and may be displayed by the window manager
# as small as 16x16 (but possibly larger).
# productLogo is used as the logo at the top of the left-hand column
# which shows the steps to be taken. The image should be square,
# and is displayed at 80x80 pixels (also on HiDPI).
# productWallpaper is an optional image, which if present, will replace
# the normal solid background on every page of the application.
# It can be any size and proportion,
# and will be tiled to fit the entire window.
# For a non-tiled wallpaper, the size should be the same as
# the overall window, see *windowSize* above (800x520).
# productWelcome is shown on the welcome page of the application in
# the middle of the window, below the welcome text. It can be
# any size and proportion, and will be scaled to fit inside
# the window. Use `welcomeExpandingLogo` to make it non-scaled.
# Recommended size is 320x150.
#
# These filenames can also use substitutions from os-release (see above).
images:
productLogo: "logo.png"
productIcon: "icon.png"
productWelcome: "welcome.png"
# productBanner: "banner.png"
# productWallpaper: "wallpaper.png"
# Colors for text and background components.
#
# - sidebarBackground is the background of the sidebar
# - sidebarText is the (foreground) text color
# - sidebarTextHighlight sets the background of the selected (current) step.
# Optional, and defaults to the application palette.
# - sidebarSelect is the text color of the selected step.
#
# These colors can **also** be set through the stylesheet, if the
# branding component also ships a stylesheet.qss. Then they are
# the corresponding CSS attributes of #sidebarApp.
style:
SidebarBackground: "#22272e"
SidebarText: "#96c5f6"
SidebarTextCurrent: "#ffffff"
SidebarBackgroundCurrent: "#7e4242"
### SLIDESHOW
#
# The slideshow is displayed during execution steps (e.g. when the
# installer is actually writing to disk and doing other slow things).
# The slideshow can be a QML file (recommended) which can display
# arbitrary things -- text, images, animations, or even play a game --
# during the execution step. The QML **is** abruptly stopped when the
# execution step is done, though, so maybe a game isn't a great idea.
#
# The slideshow can also be a sequence of images (not recommended unless
# you don't want QML at all in your Calamares). The images are displayed
# at a rate of 1 every 2 seconds during the execution step.
#
# To configure a QML file, list a single filename:
# slideshow: "show.qml"
# To configure images, like the filenames (here, as an inline list):
# slideshow: [ "/etc/calamares/slideshow/0.png", "/etc/logo.png" ]
slideshow: "show.qml"
# There are two available APIs for a QML slideshow:
# - 1 (the default) loads the entire slideshow when the installation-
# slideshow page is shown and starts the QML then. The QML
# is never stopped (after installation is done, times etc.
# continue to fire).
# - 2 loads the slideshow on startup and calls onActivate() and
# onLeave() in the root object. After the installation is done,
# the show is stopped (first by calling onLeave(), then destroying
# the QML components).
#
# An image slideshow does not need to have the API defined.
slideshowAPI: 2
# log feature
uploadServer :
type : "fiche"
url : "http://termbin.com:9999"
sizeLimit : -1

View File

@ -0,0 +1,105 @@
/* Sample of QML progress tree.
SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
SPDX-FileCopyrightText: 2021 Anke Boersma <demm@kaosx.us>
SPDX-License-Identifier: GPL-3.0-or-later
The progress tree (actually a list) is generally "vertical" in layout,
with the steps going "down", but it could also be a more compact
horizontal layout with suitable branding settings.
This example emulates the layout and size of the widgets progress tree.
*/
import io.calamares.ui 1.0
import io.calamares.core 1.0
import QtQuick 2.3
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.15
Rectangle {
id: sideBar;
color: Branding.styleString( Branding.SidebarBackground );
height: 38;
width: parent.width;
RowLayout {
anchors.fill: parent;
spacing: 2;
Image {
Layout.leftMargin: 12;
Layout.rightMargin: 12;
Layout.alignment: Qt.AlignCenter;
id: logo;
width: 30;
height: width; // square
source: "file:/" + Branding.imagePath(Branding.ProductLogo);
sourceSize.width: width;
sourceSize.height: height;
}
Repeater {
model: ViewManager
Rectangle {
Layout.leftMargin: 6;
Layout.rightMargin: 6;
Layout.fillWidth: true;
Layout.alignment: Qt.AlignCenter;
height: 32;
radius: 6;
color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarBackgroundCurrent : Branding.SidebarBackground );
Text {
horizontalAlignment: Text.AlignHCenter;
verticalAlignment: Text.AlignVCenter;
anchors.verticalCenter: parent.verticalCenter;
anchors.horizontalCenter: parent.horizontalCenter;
x: parent.x + 12;
color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextCurrent : Branding.SidebarText );
text: display;
width: parent.width;
wrapMode: Text.WordWrap;
font.weight: (index == ViewManager.currentStepIndex ? Font.Bold : Font.Normal);
font.pointSize : (index == ViewManager.currentStepIndex ? 10 : 9);
}
}
}
Item {
Layout.fillHeight: true;
}
/*Rectangle {
id: debugArea;
Layout.rightMargin: (debug.enabled) ? 8 : 0;
Layout.bottomMargin: (debug.enabled) ? 18 : 0;
Layout.fillWidth: true;
Layout.alignment: Qt.AlignCenter;
height: 32;
//width: parent.width;
color: Branding.styleString( debug.enabled ? Branding.SidebarTextHighlight : Branding.SidebarBackground );
visible: debug.enabled;
MouseArea {
id: mouseAreaDebug;
anchors.fill: parent;
cursorShape: Qt.PointingHandCursor;
hoverEnabled: true;
Text {
anchors.verticalCenter: parent.verticalCenter;
anchors.horizontalCenter: parent.horizontalCenter;
text: qsTr("Debug");
color: Branding.styleString( Branding.SidebarTextSelected );
font.pointSize: 9;
}
onClicked: debug.toggle();
}
}*/
}
}

View File

@ -0,0 +1,107 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* SPDX-FileCopyrightText: 2021 Anke Boersma <demm@kaosx.us>
* SPDX-License-Identifier: GPL-3.0-or-later
* License-Filename: LICENSE
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
import io.calamares.core 1.0
import io.calamares.ui 1.0
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.3
import org.kde.kirigami 2.7 as Kirigami
import QtGraphicalEffects 1.0
import QtQuick.Window 2.3
Page {
id: finished
// needs to come from umount.conf
property var configdestLog: "/var/log/Calamares.log"
width: parent.width
height: parent.height
header: Kirigami.Heading {
width: parent.width
height: 80
id: header
Layout.fillWidth: true
horizontalAlignment: Qt.AlignHCenter
color: "white"
level: 1
text: qsTr("Installation Completed")
Text {
anchors.top: header.bottom
anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter
font.pointSize: 14
color: "white"
text: qsTr("%1 has been installed on your computer.<br/>
You may now restart into your new system, or continue using the Live environment.").arg(Branding.string(Branding.ProductName))
}
Image {
source: "logo.png"
anchors.top: header.bottom
anchors.topMargin: 80
anchors.horizontalCenter: parent.horizontalCenter
width: 192
height: 192
mipmap: true
}
}
RowLayout {
Layout.alignment: Qt.AlignRight|Qt.AlignVCenter
anchors.centerIn: parent
spacing: 6
Button {
id: button
text: qsTr("Close Installer")
icon.name: "application-exit"
onClicked: { ViewManager.quit(); }
//onClicked: console.log("close calamares");
}
Button {
text: qsTr("Restart System")
icon.name: "system-reboot"
onClicked: {
config.doRestart(true);
ViewManager.quit();
}
}
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
anchors.bottom: parent.bottom
anchors.bottomMargin : 128
anchors.horizontalCenter: parent.horizontalCenter
Text {
anchors.centerIn: parent
anchors.top: parent.top
horizontalAlignment: Text.AlignHCenter
color: "white"
text: qsTr("<p>A full log of the install is available as installation.log in the home directory of the Live user.<br/>
This log is copied to %1 of the target system.</p>").arg(configdestLog)
}
}
function onActivate() {
}
function onLeave() {
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ar">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="64"/>
<source>This is a second Slide element.</source>
<translation>عرض الثاني</translation>
</message>
<message>
<location filename="../show.qml" line="68"/>
<source>This is a third Slide element.</source>
<translation>عرض الثالث</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="64"/>
<source>This is a second Slide element.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../show.qml" line="68"/>
<source>This is a third Slide element.</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="eo">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="64"/>
<source>This is a second Slide element.</source>
<translation>Ĉi tio estas la dua gliteja.</translation>
</message>
<message>
<location filename="../show.qml" line="68"/>
<source>This is a third Slide element.</source>
<translation>Ĉi tio estas la tria gliteja.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="64"/>
<source>This is a second Slide element.</source>
<translation>Ceci est la deuxieme affiche.</translation>
</message>
<message>
<location filename="../show.qml" line="68"/>
<source>This is a third Slide element.</source>
<translation>La troisième affice ce trouve ici.</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="nl">
<context>
<name>show</name>
<message>
<location filename="../show.qml" line="64"/>
<source>This is a second Slide element.</source>
<translation>Dit is het tweede Dia element.</translation>
</message>
<message>
<location filename="../show.qml" line="68"/>
<source>This is a third Slide element.</source>
<translation>Dit is het derde Dia element.</translation>
</message>
</context>
</TS>

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,166 @@
/* === This file is part of Calamares - <https://calamares.io> ===
*
* SPDX-FileCopyrightText: 2015 Teo Mrnjavac <teo@kde.org>
* SPDX-FileCopyrightText: 2018 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Calamares is Free Software: see the License-Identifier above.
*
*/
import QtQuick 2.0;
import calamares.slideshow 1.0;
Presentation
{
id: presentation
function nextSlide() {
console.log("QML Component (default slideshow) Next slide");
presentation.goToNextSlide();
}
Timer {
id: advanceTimer
interval: 30000
running: presentation.activatedInCalamares
repeat: true
onTriggered: nextSlide()
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background1
source: "slide1.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background2
source: "slide2.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background3
source: "slide3.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background4
source: "slide4.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background5
source: "slide5.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background6
source: "slide6.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background7
source: "slide7.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
Slide {
anchors.fill: parent
anchors.verticalCenterOffset: 0
Image {
id: background8
source: "slide8.png"
width: parent.width; height: parent.height
horizontalAlignment: Image.AlignCenter
verticalAlignment: Image.AlignTop
fillMode: Image.Stretch
anchors.fill: parent
}
}
// When this slideshow is loaded as a V1 slideshow, only
// activatedInCalamares is set, which starts the timer (see above).
//
// In V2, also the onActivate() and onLeave() methods are called.
// These example functions log a message (and re-start the slides
// from the first).
function onActivate() {
console.log("QML Component (default slideshow) activated");
presentation.currentSlide = 0;
}
function onLeave() {
console.log("QML Component (default slideshow) deactivated");
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -0,0 +1,494 @@
/*
A branding component can ship a stylesheet (like this one)
which is applied to parts of the Calamares user-interface.
In principle, all parts can be styled through CSS.
Missing parts should be filed as issues.
The IDs are based on the object names in the C++ code.
You can use the Debug Dialog to find out object names:
- Open the debug dialog
- Choose tab *Tools*
- Click *Widget Tree* button
The list of object names is printed in the log.
Documentation for styling Qt Widgets through a stylesheet
can be found at
https://doc.qt.io/qt-5/stylesheet-examples.html
https://doc.qt.io/qt-5/stylesheet-reference.html
In Calamares, styling widget classes is supported (e.g.
using `QComboBox` as a selector).
This example stylesheet has all the actual styling commented out.
The examples are not exhaustive.
Use gammaray
*/
/* ########## MAIN APPLICATION WINDOW ########## */
#mainApp {
background-color: #22272e;
color: #96c5f6;
}
#mainText{
font : bold 14px;
}
#sidebarApp {
background-color: #22272e;
color: #96c5f6;
}
#logoApp {
background-color: #22272e;
color: #96c5f6;
}
#sidebarMenuApp {
padding: 3px;
background-color: #22272e;
}
#view-button-back:hover {
color: #96c5f6;
}
#view-button-next:hover {
color: #96c5f6;
}
#view-button-cancel:hover {
color: #96c5f6;
}
#debugButton {
background-color: none;
font: bold 8px;
color: #96c5f6;
height: 32px;
border: none;
}
#debugButton:pressed {
color: #7f3fbf;
}
#debugButton:hover {
color: #7f3fbf;
}
#aboutButton {
background-color: none;
font: 14px;
color: #96c5f6;
height: 32px;
border: none;
}
#aboutButton:pressed {
color: #7f3fbf;
}
#aboutButton:hover {
color: #7f3fbf;
}
#donateButton:hover {
color: #7f3fbf;
}
#supportButton:hover {
color: #7f3fbf;
}
#knownIssuesButton:hover {
color: #7f3fbf;
}
#releaseNotesButton:hover {
color: #7f3fbf;
}
#products {
color: #96c5f6;
padding-left: 5px;
padding-right: 5px;
padding-top: 5px;
font: 15px;
}
#productScreenshot {
padding-top: 1px;
padding-bottom: 1px;
}
/*set to same as main app background-color and 1px to hide it*/
#productName {
color: #96c5f6;
padding-left: 40px;
font: 16px;
}
#productDescription {
color: #96c5f6;
padding-left: 40px;
padding-right: 40px;
font: 14px;
}
QWidget {
background-color: #22272e;
color: #aaaaaa;
font: 14px;
}
QScrollArea {
background-color: #22272e;
color: #aaaaaa;
font: 14px;
}
QLabel {
background-color: #22272e;
color: #aaaaaa;
font: 14px;
}
// QAbstractSpinBox {
// }
// QListWidget::item:alternate {
// }
/* ########## TOOLTIP ########## */
QToolTip {
background-color: #22272e;
color: #aaaaaa;
font : 14px;
padding: 3px;
border: none;
}
QPushButton {
color: #aaaaaa;
font : 14px;
padding: 10px;
}
// QPushButton:pressed {
// }
//
// QPushButton:hover {
// }
QDialogButtonBox {
dialogbuttonbox-buttons-have-icons: 0;
color: #96c5f6;
font: 14px;
}
/* ########## SCROLL BAR ########## */
// QScrollBar:vertical {
// background: #efefef;
// width: 20px;
// margin: 38px 0 20px 0;
// }
//
// QScrollBar::handle:vertical {
// background-color: #22272e;
// max-height: 25px;
// }
//
// QScrollBar::sub-line:vertical {
// border: none;
// background: none;
// height: 20px;
// subcontrol-position: top;
// subcontrol-origin: margin;
// }
//
// QScrollBar::add-line:vertical {
// border: none;
// background: none;
// height: 20px;
// subcontrol-position: bottom;
// subcontrol-origin: margin;
// }
/* ########## QLIST VIEW ########## */
QListView {
background-color: #22272e;
alternate-background-color: #22272e;
color: #aaaaaa;
font: 14px;
}
// QListView::item:alternate {
// background-color: #22272e;
// color: #aaaaaa;
// }
//
// QListView::item:!alternate:selected:active {
// background-color: #22272e;
// color: #aaaaaa;
// }
//
// QListView::item:selected:active {
// background-color: #22272e;
// color: #aaaaaa;
// }
//
// QListView::item:selected:!active {
// background-color: #22272e;
// color: #aaaaaa;
// }
//
// QListView::item:hover {
// background-color: #22272e;
// color: #aaaaaa;
// }
//
// QListView#listLayout::item:!alternate:selected:active {
// background-color: #22272e;
// color: #aaaaaa;
// }
//
// QListView#listVariant::item:!alternate:selected:active {
// background-color: #22272e;
// color: #aaaaaa;
// }
/* ########## QLINE EDIT ########## */
QTextEdit {
background-color: #22272e;
color: #aaaaaa;
font: 14px;
}
QLineEdit {
background-color: #22272e;
color: #aaaaaa;
font: 14px;
}
// QLineEdit#LE_TestKeyboard {
// font: 14px;
// }
//
// QLineEdit#m_passphraseLineEdit, QLineEdit#vgName,
// QLineEdit#m_confirmLineEdit {
// font: 14px;
// }
//
// QLineEdit#textBoxUserVerifiedPassword, QLineEdit#textBoxVerifiedRootPassword {
// font: 14px;
// }
//
// QLineEdit#textBoxFullName, QLineEdit#textBoxLoginName, QLineEdit#textBoxHostName,
// QLineEdit#textBoxUserPassword, QLineEdit#textBoxRootPassword {
// font: 14px;
// }
#textBoxFullName, #textBoxLoginName, #textBoxHostName, #textBoxUserPassword,
#textBoxRootPassword, #textBoxAutoLogin, #vgName {
font: 14px;
}
#textBoxUserVerifiedPassword, #textBoxVerifiedRootPassword,
#LE_TestKeyboard, #m_confirmLineEdit, #m_passphraseLineEdit {
font: 14px;
}
/* ##########PARTITION ########## */
#partitionLabel {
}
#partitionLabelsView {
}
#CreatePartitionDialog {
}
#partResizerWidget {
font: 14px;
}
/* ########## PAGE_USERSETUP ########## */
#labelWhatIsYourName {
font: 14px;
}
#textBoxFullName {
font: 14px;
}
#labelFullName {
font: 14px;
}
#labelFullNameError {
font: 14px;
}
#username_label_2 {
font: 14px;
}
#textBoxLoginName {
font: 14px;
}
#labelUsername {
font: 14px;
}
#labelUsernameError {
font: 14px;
}
#hostname_label_2 {
font: 14px;
}
#textBoxHostName {
font: 14px;
}
#labelHostname {
font: 14px;
}
#labelHostnameError {
font: 14px;
}
#password_label_2 {
font: 14px;
}
#textBoxUserPassword {
font: 14px;
}
#textBoxUserVerifiedPassword {
font: 14px;
}
#labelUserPassword {
font: 14px;
}
#labelUserPasswordError {
font: 14px;
}
#checkBoxRequireStrongPassword {
font: 14px;
}
#checkBoxDoAutoLogin {
font: 14px;
}
#checkBoxReusePassword {
font: 14px;
}
#labelChooseRootPassword {
font: 14px;
}
#textBoxRootPassword {
font: 14px;
}
#textBoxVerifiedRootPassword {
font: 14px;
}
#labelRootPassword {
font: 14px;
}
#labelRootPasswordError {
font: 14px;
}
/* ########## COMBO BOX ########## */
QComboBox {
color: #aaaaaa;
font: 14px;
}
QComboBox::item:selected {
background-color: #22272e;
color: #aaaaaa;
}
#mountPointComboBox::drop-down {
font: 14px;
}
/* ########## SPIN BOX ########## */
QSpinBox {
color: #aaaaaa;
font: 14px;
}
/* ########## TREE VIEW ########## */
QTreeView {
background-color: #22272e;
alternate-background-color: #22272e;
color: #aaaaaa;
font: 14px;
show-decoration-selected: 0;
}
QTreeView::item {
background-color: #22272e;
padding: 2px;
}
QTreeView::item:selected {
background-color: #22272e;
font: bold;
}
// QTreeView::branch:has-siblings:!adjoins-item {
// }
// QTreeView::branch:has-siblings:adjoins-item {
// }
// QTreeView::branch:!has-children:!has-siblings:adjoins-item {
// }
// QTreeView::branch:has-children:!has-siblings:closed,
// QTreeView::branch:closed:has-children:has-siblings {
// }
// QTreeView::branch:open:has-children:!has-siblings,
// QTreeView::branch:open:has-children:has-siblings {
// }
/* ########## CHECK BOX ########## */
QCheckBox {
color: #aaaaaa;
font: 14px;
}
// QCheckBox::indicator:unchecked {
// }
// QCheckBox::indicator:checked {
// }
// QItemSelectionModel::Select {
// }
QRadioButton {
color: #aaaaaa;
font: 14px;
}
/* ########## HEADER VIEW ########## */
QHeaderView::section {
font : 14px;
}
/* ########## PROGRESS BAR ########## */
QProgressBar {
text-align: center;
}
QProgressBar::chunk {
background-color: #22272e;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@ -0,0 +1,84 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Bootloader configuration. The bootloader is installed to allow
# the system to start (and pick one of the installed operating
# systems to run).
#
# Take note that Debian-derivatives that use unmodified GRUB EFI packages
# should specifically set *efiBootloaderId* to "debian" because that is
# hard-coded in `grubx64.efi`.
---
# A variable from global storage which overrides the value of efiBootLoader
#efiBootLoaderVar: "packagechooser_bootloader"
efiBootLoaderVar: "packagechooser_packagechooserq"
# Define which bootloader you want to use for EFI installations
# Possible options are 'grub', 'sb-shim', 'systemd-boot' or 'refind'
efiBootLoader: "refind"
# systemd-boot configuration files settings
# kernelSearchPath is the path relative to the root of the install to search for kernels
# A kernel is identified by finding files which match regular expression, kernelPattern
kernelSearchPath: "/usr/lib/modules"
kernelPattern: "^vmlinuz.*"
# loaderEntries is an array of options to add to loader.conf for systemd-boot
# please note that the "default" option is added programmatically
loaderEntries:
- "timeout 5"
- "console-mode max"
# systemd-boot and refind support custom kernel params
kernelParams: [ "nvme_load=YES","nowatchdog","zswap.enabled=0","page_alloc.shuffle=1","threadirqs","split_lock_detect=off","pci=pcie_bus_perf","add_efi_memmap","quiet" ]
# A list of kernel names that refind should accept as kernels
refindKernelList: [ "linux","linux-lts","linux-zen","linux-hardened","linux-xanmod-anbox","linux-xanmod","linux-xanmod-lts","linux-lqx","linux-cachyos","linux-cachyos-cfs","linux-cachyos-bore","linux-cachyos-tt","linux-cachyos-bmq","linux-cachyos-pds","linux-cachyos-lts" ]
# GRUB 2 binary names and boot directory
# Some distributions (e.g. Fedora) use grub2-* (resp. /boot/grub2/) names.
# These names are also used when using sb-shim, since that needs some
# GRUB functionality (notably grub-probe) to work. As needed, you may use
# complete paths like `/usr/bin/efibootmgr` for the executables.
#
grubInstall: "grub-install"
grubMkconfig: "grub-mkconfig"
grubCfg: "/boot/grub/grub.cfg"
grubProbe: "grub-probe"
efiBootMgr: "efibootmgr"
# Optionally set the bootloader ID to use for EFI. This is passed to
# grub-install --bootloader-id.
#
# If not set here, the value from bootloaderEntryName from branding.desc
# is used, with problematic characters (space and slash) replaced.
#
# The ID is also used as a directory name within the EFI environment,
# and the bootloader is copied from /boot/efi/EFI/<dirname>/ . When
# setting the option here, keep in mind that the name is sanitized
# (problematic characters, see above, are replaced).
#
# There are some special words possible at the end of *efiBootloaderId*:
# ${SERIAL} can be used to obtain a uniquely-numbered suffix
# that is added to the Id (yielding, e.g., `dirname1` or `dirname72`)
# ${RANDOM} can be used to obtain a unique 4-digit hex suffix
# ${PHRASE} can be used to obtain a unique 1-to-3-word suffix
# from a dictionary of space-themed words
# These words must be at the **end** of the *efiBootloaderId* value.
# There must also be at most one of them. If there is none, no suffix-
# processing is done and the *efiBootloaderId* is used unchanged.
#
# NOTE: Debian derivatives that use the unmodified Debian GRUB EFI
# packages may need to set this to "debian" because that is
# hard-coded in `grubx64.efi`.
#
efiBootloaderId: "Melawy Linux"
# Optionally install a copy of the GRUB EFI bootloader as the EFI
# fallback loader (either bootia32.efi or bootx64.efi depending on
# the system). This may be needed on certain systems (Intel DH87MC
# seems to be the only one). If you set this to false, take care
# to add another module to optionally install the fallback on those
# boards that need it.
installEFIFallback: true

View File

@ -0,0 +1,984 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
# SPDX-FileCopyrightText: 2014 Anke Boersma <demm@kaosx.us>
# SPDX-FileCopyrightText: 2014 Daniel Hillenbrand <codeworkx@bbqlinux.org>
# SPDX-FileCopyrightText: 2014 Benjamin Vaudour <benjamin.vaudour@yahoo.fr>
# SPDX-FileCopyrightText: 2014-2019 Kevin Kofler <kevin.kofler@chello.at>
# SPDX-FileCopyrightText: 2015-2018 Philip Mueller <philm@manjaro.org>
# SPDX-FileCopyrightText: 2016-2017 Teo Mrnjavac <teo@kde.org>
# SPDX-FileCopyrightText: 2017 Alf Gaida <agaida@siduction.org>
# SPDX-FileCopyrightText: 2017-2019 Adriaan de Groot <groot@kde.org>
# SPDX-FileCopyrightText: 2017 Gabriel Craciunescu <crazy@frugalware.org>
# SPDX-FileCopyrightText: 2017 Ben Green <Bezzy1999@hotmail.com>
# SPDX-FileCopyrightText: 2021 Neal Gompa <ngompa13@gmail.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# Calamares is Free Software: see the License-Identifier above.
#
import fileinput
import os
import re
import shutil
import subprocess
import libcalamares
from libcalamares.utils import check_target_env_call
import gettext
_ = gettext.translation("calamares-python",
localedir=libcalamares.utils.gettext_path(),
languages=libcalamares.utils.gettext_languages(),
fallback=True).gettext
# This is the sanitizer used all over to tidy up filenames
# to make identifiers (or to clean up names to make filenames).
file_name_sanitizer = str.maketrans(" /()", "_-__")
def pretty_name():
return _("Install bootloader.")
def get_uuid():
"""
Checks and passes 'uuid' to other routine.
:return:
"""
partitions = libcalamares.globalstorage.value("partitions")
for partition in partitions:
if partition["mountPoint"] == "/":
libcalamares.utils.debug("Root partition uuid: \"{!s}\"".format(partition["uuid"]))
return partition["uuid"]
return ""
def get_kernel_line(kernel_type):
"""
Passes 'kernel_line' to other routine based on configuration file.
:param kernel_type:
:return:
"""
if kernel_type == "fallback":
if "fallbackKernelLine" in libcalamares.job.configuration:
return libcalamares.job.configuration["fallbackKernelLine"]
else:
return " (fallback)"
else:
if "kernelLine" in libcalamares.job.configuration:
return libcalamares.job.configuration["kernelLine"]
else:
return ""
def get_zfs_root():
"""
Looks in global storage to find the zfs root
:return: A string containing the path to the zfs root or None if it is not found
"""
zfs = libcalamares.globalstorage.value("zfsDatasets")
if not zfs:
libcalamares.utils.warning("Failed to locate zfs dataset list")
return None
# Find the root dataset
for dataset in zfs:
try:
if dataset["mountpoint"] == "/":
return dataset["zpool"] + "/" + dataset["dsName"]
except KeyError:
# This should be impossible
libcalamares.utils.warning("Internal error handling zfs dataset")
raise
return None
def is_btrfs_root(partition):
""" Returns True if the partition object refers to a btrfs root filesystem
:param partition: A partition map from global storage
:return: True if btrfs and root, False otherwise
"""
return partition["mountPoint"] == "/" and partition["fs"] == "btrfs"
def is_zfs_root(partition):
""" Returns True if the partition object refers to a zfs root filesystem
:param partition: A partition map from global storage
:return: True if zfs and root, False otherwise
"""
return partition["mountPoint"] == "/" and partition["fs"] == "zfs"
def have_program_in_target(program : str):
"""Returns @c True if @p program is in path in the target"""
return libcalamares.utils.target_env_call(["/usr/bin/which", program]) == 0
def get_kernel_params(uuid):
# Configured kernel parameters (default "quiet"), if plymouth installed, add splash
# screen parameter and then "rw".
kernel_params = libcalamares.job.configuration.get("kernelParams", ["quiet"])
if have_program_in_target("plymouth"):
kernel_params.append("splash")
kernel_params.append("bgrt_disable")
kernel_params.append("rw")
use_systemd_naming = have_program_in_target("dracut") or (libcalamares.utils.target_env_call(["/usr/bin/grep", "-q", "^HOOKS.*systemd", "/etc/mkinitcpio.conf"]) == 0)
partitions = libcalamares.globalstorage.value("partitions")
try:
gpu_drivers = libcalamares.globalstorage.value("gpuDrivers")
except KeyError:
pass
cryptdevice_params = []
swap_uuid = ""
swap_outer_mappername = None
swap_outer_uuid = None
has_dracut = libcalamares.utils.target_env_call(["sh", "-c", "which dracut"]) == 0
uses_systemd_hook = libcalamares.utils.target_env_call(["sh", "-c",
"grep -q \"^HOOKS.*systemd\" /etc/mkinitcpio.conf"]) == 0
use_systemd_naming = has_dracut or uses_systemd_hook
# Take over swap settings:
# - unencrypted swap partition sets swap_uuid
# - encrypted root sets cryptdevice_params
for partition in partitions:
if partition["fs"] == "linuxswap" and not partition.get("claimed", None):
# Skip foreign swap
continue
has_luks = "luksMapperName" in partition
if partition["fs"] == "linuxswap" and not has_luks:
swap_uuid = partition["uuid"]
if partition["fs"] == "linuxswap" and has_luks:
swap_outer_mappername = partition["luksMapperName"]
swap_outer_uuid = partition["luksUuid"]
if partition["mountPoint"] == "/" and has_luks:
if use_systemd_naming:
cryptdevice_params = [f"rd.luks.uuid={partition['luksUuid']}"]
else:
cryptdevice_params = [f"cryptdevice=UUID={partition['luksUuid']}:{partition['luksMapperName']}"]
cryptdevice_params.append(f"root=/dev/mapper/{partition['luksMapperName']}")
# btrfs and zfs handling
for partition in partitions:
# If a btrfs root subvolume wasn't set, it means the root is directly on the partition
# and this option isn't needed
if is_btrfs_root(partition):
btrfs_root_subvolume = libcalamares.globalstorage.value("btrfsRootSubvolume")
if btrfs_root_subvolume:
kernel_params.append("rootflags=subvol=" + btrfs_root_subvolume)
# zfs needs to be told the location of the root dataset
if is_zfs_root(partition):
zfs_root_path = get_zfs_root()
if zfs_root_path is not None:
kernel_params.append("root=ZFS=" + zfs_root_path)
else:
# Something is really broken if we get to this point
libcalamares.utils.warning("Internal error handling zfs dataset")
raise Exception("Internal zfs data missing, please contact your distribution")
if cryptdevice_params:
kernel_params.extend(cryptdevice_params)
else:
kernel_params.append("root=UUID={!s}".format(uuid))
if swap_uuid:
kernel_params.append("resume=UUID={!s}".format(swap_uuid))
if use_systemd_naming and swap_outer_uuid:
kernel_params.append(f"rd.luks.uuid={swap_outer_uuid}")
if swap_outer_mappername:
kernel_params.append(f"resume=/dev/mapper/{swap_outer_mappername}")
if "nvidia" in gpu_drivers:
kernel_params.append("nvidia")
kernel_params.append("nvidia-drm.modeset=1")
kernel_params.append("nvidia-drm.fbdev=1")
kernel_params.append("nouveau.modeset=0")
# kernel_params.append("modprobe.blacklist=nouveau")
kernel_params.append("i915.modeset=1")
kernel_params.append("radeon.modeset=1")
elif "nouveau" in gpu_drivers:
kernel_params.append("nvidia")
kernel_params.append("nvidia-drm.modeset=1")
kernel_params.append("nvidia-drm.fbdev=1")
kernel_params.append("nouveau.modeset=0")
# kernel_params.append("modprobe.blacklist=nouveau")
kernel_params.append("i915.modeset=1")
kernel_params.append("radeon.modeset=1")
return kernel_params
def create_systemd_boot_conf(installation_root_path, efi_dir, uuid, kernel, kernel_version):
"""
Creates systemd-boot configuration files based on given parameters.
:param installation_root_path: A string containing the absolute path to the root of the installation
:param efi_dir: A string containing the path to the efi dir relative to the root of the installation
:param uuid: A string containing the UUID of the root volume
:param kernel: A string containing the path to the kernel relative to the root of the installation
:param kernel_version: The kernel version string
"""
# Get the kernel params and write them to /etc/kernel/cmdline
# This file is used by kernel-install
kernel_params = " ".join(get_kernel_params(uuid))
kernel_cmdline_path = os.path.join(installation_root_path, "etc", "kernel")
os.makedirs(kernel_cmdline_path, exist_ok=True)
with open(os.path.join(kernel_cmdline_path, "cmdline"), "w") as cmdline_file:
cmdline_file.write(kernel_params)
libcalamares.utils.debug(f"Configuring kernel version {kernel_version}")
# get the machine-id
with open(os.path.join(installation_root_path, "etc", "machine-id"), 'r') as machineid_file:
machine_id = machineid_file.read().rstrip('\n')
# Ensure the directory exists
machine_dir = os.path.join(installation_root_path + efi_dir, machine_id)
os.makedirs(machine_dir, exist_ok=True)
# Call kernel-install for each kernel
libcalamares.utils.target_env_process_output(["kernel-install",
"add",
kernel_version,
os.path.join("/", kernel)])
def create_loader(loader_path, installation_root_path):
"""
Writes configuration for loader.
:param loader_path: The absolute path to the loader.conf file
:param installation_root_path: The path to the root of the target installation
"""
# get the machine-id
with open(os.path.join(installation_root_path, "etc", "machine-id"), 'r') as machineid_file:
machine_id = machineid_file.read().rstrip('\n')
try:
loader_entries = libcalamares.job.configuration["loaderEntries"]
except KeyError:
libcalamares.utils.debug("No aditional loader entries found in config")
loader_entries = []
pass
lines = [f"default {machine_id}*"]
lines.extend(loader_entries)
with open(loader_path, 'w') as loader_file:
for line in lines:
loader_file.write(line + "\n")
class SuffixIterator(object):
"""
Wrapper for one of the "generator" classes below to behave like
a proper Python iterator. The iterator is initialized with a
maximum number of attempts to generate a new suffix.
"""
def __init__(self, attempts, generator):
self.generator = generator
self.attempts = attempts
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter <= self.attempts:
return self.generator.next()
raise StopIteration
class serialEfi(object):
"""
EFI Id generator that appends a serial number to the given name.
"""
def __init__(self, name):
self.name = name
# So the first call to next() will bump it to 0
self.counter = -1
def next(self):
self.counter += 1
if self.counter > 0:
return "{!s}{!s}".format(self.name, self.counter)
else:
return self.name
def render_in_base(value, base_values, length=-1):
"""
Renders @p value in base-N, where N is the number of
items in @p base_values. When rendering, use the items
of @p base_values (e.g. use "0123456789" to get regular decimal
rendering, or "ABCDEFGHIJ" for letters-as-numbers 'encoding').
If length is positive, pads out to at least that long with
leading "zeroes", whatever base_values[0] is.
"""
if value < 0:
raise ValueError("Cannot render negative values")
if len(base_values) < 2:
raise ValueError("Insufficient items for base-N rendering")
if length < 1:
length = 1
digits = []
base = len(base_values)
while value > 0:
place = value % base
value = value // base
digits.append(base_values[place])
while len(digits) < length:
digits.append(base_values[0])
return "".join(reversed(digits))
class randomEfi(object):
"""
EFI Id generator that appends a random 4-digit hex number to the given name.
"""
def __init__(self, name):
self.name = name
# So the first call to next() will bump it to 0
self.counter = -1
def next(self):
self.counter += 1
if self.counter > 0:
import random
v = random.randint(0, 65535) # 16 bits
return "{!s}{!s}".format(self.name, render_in_base(v, "0123456789ABCDEF", 4))
else:
return self.name
class phraseEfi(object):
"""
EFI Id generator that appends a random phrase to the given name.
"""
words = ("Sun", "Moon", "Mars", "Soyuz", "Falcon", "Kuaizhou", "Gaganyaan")
def __init__(self, name):
self.name = name
# So the first call to next() will bump it to 0
self.counter = -1
def next(self):
self.counter += 1
if self.counter > 0:
import random
desired_length = 1 + self.counter // 5
v = random.randint(0, len(self.words) ** desired_length)
return "{!s}{!s}".format(self.name, render_in_base(v, self.words))
else:
return self.name
def get_efi_suffix_generator(name):
"""
Handle EFI bootloader Ids with ${<something>} for suffix-processing.
"""
if "${" not in name:
raise ValueError("Misplaced call to get_efi_suffix_generator, no ${}")
if not name.endswith("}"):
raise ValueError("Misplaced call to get_efi_suffix_generator, no trailing ${}")
if name.count("${") > 1:
raise ValueError("EFI ID {!r} contains multiple generators".format(name))
import re
prefix, generator_name = re.match("(.*)\${([^}]*)}$", name).groups()
if generator_name not in ("SERIAL", "RANDOM", "PHRASE"):
raise ValueError("EFI suffix {!r} is unknown".format(generator_name))
generator = None
if generator_name == "SERIAL":
generator = serialEfi(prefix)
elif generator_name == "RANDOM":
generator = randomEfi(prefix)
elif generator_name == "PHRASE":
generator = phraseEfi(prefix)
if generator is None:
raise ValueError("EFI suffix {!r} is unsupported".format(generator_name))
return generator
def change_efi_suffix(efi_directory, bootloader_id):
"""
Returns a label based on @p bootloader_id that is usable within
@p efi_directory. If there is a ${<something>} suffix marker
in the given id, tries to generate a unique label.
"""
if bootloader_id.endswith("}") and "${" in bootloader_id:
# Do 10 attempts with any suffix generator
g = SuffixIterator(10, get_efi_suffix_generator(bootloader_id))
else:
# Just one attempt
g = [bootloader_id]
for candidate_name in g:
if not os.path.exists(os.path.join(efi_directory, candidate_name)):
return candidate_name
return bootloader_id
def efi_label(efi_directory):
"""
Returns a sanitized label, possibly unique, that can be
used within @p efi_directory.
"""
if "efiBootloaderId" in libcalamares.job.configuration:
efi_bootloader_id = change_efi_suffix(efi_directory, libcalamares.job.configuration["efiBootloaderId"])
else:
branding = libcalamares.globalstorage.value("branding")
efi_bootloader_id = branding["bootloaderEntryName"]
return efi_bootloader_id.translate(file_name_sanitizer)
def efi_word_size():
# get bitness of the underlying UEFI
try:
sysfile = open("/sys/firmware/efi/fw_platform_size", "r")
efi_bitness = sysfile.read(2)
except Exception:
# if the kernel is older than 4.0, the UEFI bitness likely isn't
# exposed to the userspace so we assume a 64 bit UEFI here
efi_bitness = "64"
return efi_bitness
def efi_boot_next():
"""
Tell EFI to definitely boot into the just-installed
system next time.
"""
boot_mgr = libcalamares.job.configuration["efiBootMgr"]
boot_entry = None
efi_bootvars = subprocess.check_output([boot_mgr], universal_newlines=True)
for line in efi_bootvars.split('\n'):
if not line:
continue
words = line.split()
if len(words) >= 2 and words[0] == "BootOrder:":
boot_entry = words[1].split(',')[0]
break
if boot_entry:
subprocess.call([boot_mgr, "-n", boot_entry])
def get_kernels(installation_root_path):
"""
Gets a list of kernels and associated values for each kernel. This will work as is for many distros.
If not, it should be safe to modify it to better support your distro
:param installation_root_path: A string with the absolute path to the root of the installation
Returns a list of 3-tuples
Each 3-tuple contains the kernel, kernel_type and kernel_version
"""
try:
kernel_search_path = libcalamares.job.configuration["kernelSearchPath"]
except KeyError:
libcalamares.utils.warning("No kernel pattern found in configuration, using '/usr/lib/modules'")
kernel_search_path = "/usr/lib/modules"
pass
kernel_list = []
try:
kernel_pattern = libcalamares.job.configuration["kernelPattern"]
except KeyError:
libcalamares.utils.warning("No kernel pattern found in configuration, using 'vmlinuz'")
kernel_pattern = "vmlinuz"
pass
# find all the installed kernels
for root, dirs, files in os.walk(os.path.join(installation_root_path, kernel_search_path.lstrip('/'))):
for file in files:
if re.search(kernel_pattern, file):
rel_root = os.path.relpath(root, installation_root_path)
kernel_list.append((os.path.join(rel_root, file), "default", os.path.basename(root)))
return kernel_list
def install_clr_boot_manager():
"""
Installs clr-boot-manager as the bootloader for EFI systems
"""
libcalamares.utils.debug("Bootloader: clr-boot-manager")
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
kernel_config_path = os.path.join(installation_root_path, "etc", "kernel")
os.makedirs(kernel_config_path, exist_ok=True)
cmdline_path = os.path.join(kernel_config_path, "cmdline")
# Get the kernel params
uuid = get_uuid()
kernel_params = " ".join(get_kernel_params(uuid))
# Write out the cmdline file for clr-boot-manager
with open(cmdline_path, "w") as cmdline_file:
cmdline_file.write(kernel_params)
check_target_env_call(["clr-boot-manager", "update"])
def install_systemd_boot(efi_directory):
"""
Installs systemd-boot as bootloader for EFI setups.
:param efi_directory:
"""
libcalamares.utils.debug("Bootloader: systemd-boot")
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
install_efi_directory = installation_root_path + efi_directory
uuid = get_uuid()
loader_path = os.path.join(install_efi_directory,
"loader",
"loader.conf")
subprocess.call(["bootctl",
"--path={!s}".format(install_efi_directory),
"install"])
for (kernel, kernel_type, kernel_version) in get_kernels(installation_root_path):
create_systemd_boot_conf(installation_root_path,
efi_directory,
uuid,
kernel,
kernel_version)
create_loader(loader_path, installation_root_path)
def get_grub_efi_parameters():
"""
Returns a 3-tuple of suitable parameters for GRUB EFI installation,
depending on the host machine architecture. The return is
- target name
- grub.efi name
- boot.efi name
all three are strings. May return None if there is no suitable
set for the current machine. May return unsuitable values if the
host architecture is unknown (e.g. defaults to x86_64).
"""
import platform
efi_bitness = efi_word_size()
cpu_type = platform.machine()
if efi_bitness == "32":
# Assume all 32-bitters are legacy x86
return "i386-efi", "grubia32.efi", "bootia32.efi"
elif efi_bitness == "64" and cpu_type == "aarch64":
return "arm64-efi", "grubaa64.efi", "bootaa64.efi"
elif efi_bitness == "64" and cpu_type == "loongarch64":
return "loongarch64-efi", "grubloongarch64.efi", "bootloongarch64.efi"
elif efi_bitness == "64":
# If it's not ARM, must by AMD64
return "x86_64-efi", "grubx64.efi", "bootx64.efi"
libcalamares.utils.warning(
"Could not find GRUB parameters for bits {b} and cpu {c}".format(b=repr(efi_bitness), c=repr(cpu_type)))
return None
def run_grub_mkconfig(partitions, output_file):
"""
Runs grub-mkconfig in the target environment
:param partitions: The partitions list from global storage
:param output_file: A string containing the path to the generating grub config file
:return:
"""
# zfs needs an environment variable set for grub-mkconfig
if any([is_zfs_root(partition) for partition in partitions]):
check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 " +
libcalamares.job.configuration["grubMkconfig"] + " -o " + output_file])
else:
# The input file /etc/default/grub should already be filled out by the
# grubcfg job module.
check_target_env_call([libcalamares.job.configuration["grubMkconfig"], "-o", output_file])
def run_grub_install(fw_type, partitions, efi_directory):
"""
Runs grub-install in the target environment
:param fw_type: A string which is "efi" for UEFI installs. Any other value results in a BIOS install
:param partitions: The partitions list from global storage
:param efi_directory: The path of the efi directory relative to the root of the install
:return:
"""
is_zfs = any([is_zfs_root(partition) for partition in partitions])
# zfs needs an environment variable set for grub
if is_zfs:
check_target_env_call(["sh", "-c", "echo ZPOOL_VDEV_NAME_PATH=1 >> /etc/environment"])
if fw_type == "efi":
assert efi_directory is not None
efi_bootloader_id = efi_label(efi_directory)
efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters()
if is_zfs:
check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 " + libcalamares.job.configuration["grubInstall"]
+ " --target=" + efi_target + " --efi-directory=" + efi_directory
+ " --bootloader-id=" + efi_bootloader_id + " --force"])
else:
check_target_env_call([libcalamares.job.configuration["grubInstall"],
"--target=" + efi_target,
"--efi-directory=" + efi_directory,
"--bootloader-id=" + efi_bootloader_id,
"--force"])
else:
assert efi_directory is None
if libcalamares.globalstorage.value("bootLoader") is None:
return
boot_loader = libcalamares.globalstorage.value("bootLoader")
if boot_loader["installPath"] is None:
return
if is_zfs:
check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 "
+ libcalamares.job.configuration["grubInstall"]
+ " --target=i386-pc --recheck --force "
+ boot_loader["installPath"]])
else:
check_target_env_call([libcalamares.job.configuration["grubInstall"],
"--target=i386-pc",
"--recheck",
"--force",
boot_loader["installPath"]])
def install_grub(efi_directory, fw_type):
"""
Installs grub as bootloader, either in pc or efi mode.
:param efi_directory:
:param fw_type:
"""
# get the partition from global storage
partitions = libcalamares.globalstorage.value("partitions")
if not partitions:
libcalamares.utils.warning(_("Failed to install grub, no partitions defined in global storage"))
return
if fw_type == "efi":
libcalamares.utils.debug("Bootloader: grub (efi)")
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
install_efi_directory = installation_root_path + efi_directory
if not os.path.isdir(install_efi_directory):
os.makedirs(install_efi_directory)
efi_bootloader_id = efi_label(efi_directory)
efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters()
run_grub_install(fw_type, partitions, efi_directory)
# VFAT is weird, see issue CAL-385
install_efi_directory_firmware = (vfat_correct_case(
install_efi_directory,
"EFI"))
if not os.path.exists(install_efi_directory_firmware):
os.makedirs(install_efi_directory_firmware)
# there might be several values for the boot directory
# most usual they are boot, Boot, BOOT
install_efi_boot_directory = (vfat_correct_case(
install_efi_directory_firmware,
"boot"))
if not os.path.exists(install_efi_boot_directory):
os.makedirs(install_efi_boot_directory)
# Workaround for some UEFI firmwares
fallback = "installEFIFallback"
libcalamares.utils.debug("UEFI Fallback: " + str(libcalamares.job.configuration.get(fallback, "<unset>")))
if libcalamares.job.configuration.get(fallback, True):
libcalamares.utils.debug(" .. installing '{!s}' fallback firmware".format(efi_boot_file))
efi_file_source = os.path.join(install_efi_directory_firmware,
efi_bootloader_id,
efi_grub_file)
efi_file_target = os.path.join(install_efi_boot_directory, efi_boot_file)
shutil.copy2(efi_file_source, efi_file_target)
else:
libcalamares.utils.debug("Bootloader: grub (bios)")
run_grub_install(fw_type, partitions, None)
run_grub_mkconfig(partitions, libcalamares.job.configuration["grubCfg"])
def install_secureboot(efi_directory):
"""
Installs the secureboot shim in the system by calling efibootmgr.
"""
efi_bootloader_id = efi_label(efi_directory)
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
install_efi_directory = installation_root_path + efi_directory
if efi_word_size() == "64":
install_efi_bin = "shimx64.efi"
elif efi_word_size() == "32":
install_efi_bin = "shimia32.efi"
else:
libcalamares.utils.warning(f"Unknown efi word size of {efi_word_size()} found")
return None
# Copied, roughly, from openSUSE's install script,
# and pythonified. *disk* is something like /dev/sda,
# while *drive* may return "(disk/dev/sda,gpt1)" ..
# we're interested in the numbers in the second part
# of that tuple.
efi_drive = subprocess.check_output([
libcalamares.job.configuration["grubProbe"],
"-t", "drive", "--device-map=", install_efi_directory]).decode("ascii")
efi_disk = subprocess.check_output([
libcalamares.job.configuration["grubProbe"],
"-t", "disk", "--device-map=", install_efi_directory]).decode("ascii")
efi_drive_partition = efi_drive.replace("(", "").replace(")", "").split(",")[1]
# Get the first run of digits from the partition
efi_partition_number = None
c = 0
start = None
while c < len(efi_drive_partition):
if efi_drive_partition[c].isdigit() and start is None:
start = c
if not efi_drive_partition[c].isdigit() and start is not None:
efi_partition_number = efi_drive_partition[start:c]
break
c += 1
if efi_partition_number is None:
raise ValueError("No partition number found for %s" % install_efi_directory)
subprocess.call([
libcalamares.job.configuration["efiBootMgr"],
"-c",
"-w",
"-L", efi_bootloader_id,
"-d", efi_disk,
"-p", efi_partition_number,
"-l", install_efi_directory + "/" + install_efi_bin])
efi_boot_next()
# The input file /etc/default/grub should already be filled out by the
# grubcfg job module.
check_target_env_call([libcalamares.job.configuration["grubMkconfig"],
"-o", os.path.join(efi_directory, "EFI",
efi_bootloader_id, "grub.cfg")])
def vfat_correct_case(parent, name):
for candidate in os.listdir(parent):
if name.lower() == candidate.lower():
return os.path.join(parent, candidate)
return os.path.join(parent, name)
def efi_partitions(efi_boot_path):
"""
The (one) partition mounted on @p efi_boot_path, or an empty list.
"""
return [p for p in libcalamares.globalstorage.value("partitions") if p["mountPoint"] == efi_boot_path]
def update_refind_config(efi_directory, installation_root_path):
"""
:param efi_directory: The path to the efi directory relative to the root
:param installation_root_path: The path to the root of the installation
"""
try:
kernel_list = libcalamares.job.configuration["refindKernelList"]
except KeyError:
libcalamares.utils.warning('refindKernelList not set. Skipping updating refind.conf')
return
# Update the config in the file
for line in fileinput.input(installation_root_path + efi_directory + "/EFI/refind/refind.conf", inplace=True):
line = line.strip()
if line.startswith("#extra_kernel_version_strings") or line.startswith("extra_kernel_version_strings"):
line = line.lstrip("#")
for kernel in kernel_list:
if kernel not in line:
line += "," + kernel
print(line)
def install_refind(efi_directory):
try:
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
except KeyError:
libcalamares.utils.warning('Global storage value "rootMountPoint" missing')
install_efi_directory = installation_root_path + efi_directory
uuid = get_uuid()
kernel_params = " ".join(get_kernel_params(uuid))
conf_path = os.path.join(installation_root_path, "boot/refind_linux.conf")
libcalamares.utils.host_env_process_output(["refind-install", "--root", installation_root_path])
libcalamares.utils.host_env_process_output(["refind-install", "--alldrivers", "--yes"])
with open(conf_path, "r") as refind_file:
filedata = [x.strip() for x in refind_file.readlines()]
with open(conf_path, 'w') as refind_file:
for line in filedata:
if line.startswith('"Boot with standard options"'):
line = f'"Boot with standard options" "{kernel_params}"'
elif line.startswith('"Boot to single-user mode"'):
line = f'"Boot to single-user mode" "{kernel_params}" single'
refind_file.write(line + "\n")
update_refind_config(efi_directory, installation_root_path)
libcalamares.utils.debug("Bootloader: rEFInd")
# Get the kernel params and write them to /etc/kernel/cmdline
# This file is used by dracut-ukify and dracut-initramfs
# installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
kernel_cmdline_path = os.path.join(installation_root_path, "etc", "kernel")
os.makedirs(kernel_cmdline_path, exist_ok=True)
cmdline_path = os.path.join(kernel_cmdline_path, "cmdline")
# Get the kernel params
# uuid = get_uuid()
# kernel_params = " ".join(get_kernel_params(uuid))
# Write out the cmdline file for rEFInd
with open(cmdline_path, "w") as cmdline_file:
cmdline_file.write(kernel_params)
def prepare_bootloader(fw_type):
"""
Prepares bootloader.
Based on value 'efi_boot_loader', it either calls systemd-boot
or grub to be installed.
:param fw_type:
:return:
"""
# Get the boot loader selection from global storage if it is set in the config file
try:
gs_name = libcalamares.job.configuration["efiBootLoaderVar"]
if libcalamares.globalstorage.contains(gs_name):
efi_boot_loader = libcalamares.globalstorage.value(gs_name)
else:
libcalamares.utils.warning(
f"Specified global storage value not found in global storage")
return None
except KeyError:
# If the conf value for using global storage is not set, use the setting from the config file.
try:
efi_boot_loader = libcalamares.job.configuration["efiBootLoader"]
except KeyError:
if fw_type == "efi":
libcalamares.utils.warning("Configuration missing both efiBootLoader and efiBootLoaderVar on an EFI "
"system, bootloader not installed")
return
else:
pass
# If the user has selected not to install bootloader, bail out here
if efi_boot_loader.casefold() == "none":
libcalamares.utils.debug("Skipping bootloader installation since no bootloader was selected")
return None
efi_directory = libcalamares.globalstorage.value("efiSystemPartition")
if efi_boot_loader == "clr-boot-manager":
if fw_type != "efi":
# Grub has to be installed first on non-EFI systems
install_grub(efi_directory, fw_type)
install_clr_boot_manager()
elif efi_boot_loader == "systemd-boot" and fw_type == "efi":
install_systemd_boot(efi_directory)
elif efi_boot_loader == "sb-shim" and fw_type == "efi":
install_secureboot(efi_directory)
elif efi_boot_loader == "refind" and fw_type == "efi":
install_refind(efi_directory)
elif efi_boot_loader == "grub" or fw_type != "efi":
install_grub(efi_directory, fw_type)
else:
libcalamares.utils.debug("WARNING: the combination of "
"boot-loader '{!s}' and firmware '{!s}' "
"is not supported.".format(efi_boot_loader, fw_type))
def run():
"""
Starts procedure and passes 'fw_type' to other routine.
:return:
"""
fw_type = libcalamares.globalstorage.value("firmwareType")
if libcalamares.globalstorage.value("bootLoader") is None and fw_type != "efi":
libcalamares.utils.warning("Non-EFI system, and no bootloader is set.")
return None
partitions = libcalamares.globalstorage.value("partitions")
if fw_type == "efi":
efi_system_partition = libcalamares.globalstorage.value("efiSystemPartition")
esp_found = [p for p in partitions if p["mountPoint"] == efi_system_partition]
if not esp_found:
libcalamares.utils.warning("EFI system, but nothing mounted on {!s}".format(efi_system_partition))
return None
try:
prepare_bootloader(fw_type)
except subprocess.CalledProcessError as e:
libcalamares.utils.warning(str(e))
libcalamares.utils.debug("stdout:" + str(e.stdout))
libcalamares.utils.debug("stderr:" + str(e.stderr))
return (_("Bootloader installation error"),
_("The bootloader could not be installed. The installation command <pre>{!s}</pre> returned error "
"code {!s}.")
.format(e.cmd, e.returncode))
return None

View File

@ -0,0 +1,39 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
### eos_bootloader Module
#
# This module performs the initial config for the chosen bootloader. It does not install the bootloader,
# that is left to the bootloader module. This module is intended to run before that installing any needed packages
# and preparing the bootloader module to be run
#
#
# The variable to be evaluated from globalstorage
gsName: packagechooser_packagechooserq
#
# If this config is to be used for offline installs
# offline: true
# The location on the ISO of the packages
packageLocation: /usr/share/packages
# A list of bootloaders and the packages to install for each
bootloader:
- name: grub
packages: [ grub, grub-dracut, os-prober ]
- name: systemd-boot
packages: [ systemd-boot-dracut ]
- name: refind
packages: [ refind, melawy-dracut-initramfs, melawy-dracut-ukify, melawy-refind-menu-generator, melawy-refind-theme-nier-a2 ]
- name: none
packages: [ grub-dracut ]
#bootloader:
# - name: grub
# - packages: [ grub, dracut-hook ]
# - name: systemd-boot
# - packages: [ kernel-install-for-dracut ]
# - name: refind
# - packages: [ refind, dracut-hook ]

View File

@ -0,0 +1,18 @@
---
$schema: https://json-schema.org/schema#
$id: https://calamares.io/schemas/eos_script
additionalProperties: false
type: object
properties:
gsName: { type: string }
packageLocation: { type: string }
bootloader:
type: array
items:
type: object
additionalProperties: false
properties:
name: { type: string }
packages: { type: array }
required: [ name, packages ]
required: [ gsName, packageLocation, bootloader ]

View File

@ -0,0 +1,41 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
### eos_bootloader Module
#
# This module performs the initial config for the chosen bootloader. It does not install the bootloader,
# that is left to the bootloader module. This module is intended to run before that installing any needed packages
# and preparing the bootloader module to be run
# The variable to be evaluated from globalstorage
gsName: packagechooser_packagechooserq
# If this config is to be used for offline installs
offline: true
# The location on the ISO of the packages
packageLocation: /usr/share/packages
# A list of bootloaders and the packages to install for each
bootloader:
- name: grub
packages: [ grub, grub-dracut, os-prober ]
- name: systemd-boot
packages: [ systemd-boot-dracut ]
- name: refind
packages: [ refind, melawy-dracut-initramfs, melawy-dracut-ukify, melawy-refind-menu-generator, melawy-refind-theme-nier-a2 ]
- name: none
packages: [ grub-dracut ]
#bootloader:
# - name: grub
# - packages: [ grub, dracut-hook ]
# - name: systemd-boot
# - packages: [ kernel-install-for-dracut ]
# - name: refind
# - packages: [ refind, dracut-hook ]

View File

@ -0,0 +1,170 @@
#!/usr/bin/env python3
import os
import subprocess
import shutil
import libcalamares
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
custom_status_message = None
name = "Prepare for bootloader"
user_output = False
def pretty_name():
return _(name)
def pretty_status_message():
if custom_status_message is not None:
return custom_status_message
def is_resume_needed():
partitions = libcalamares.globalstorage.value("partitions")
for partition in partitions:
if partition["fs"] == "linuxswap":
return True
return False
def get_local_packages(packages):
try:
package_location = libcalamares.job.configuration["packageLocation"]
except KeyError:
return "Configuration Error", "No package location defined in config"
if not os.path.exists(package_location):
return ("Package location missing",
f"{package_location} is not currently available")
try:
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
except KeyError:
libcalamares.utils.warning('Global storage value "rootMountPoint" missing')
package_files = []
for root, dirs, files in os.walk(os.path.join(installation_root_path, package_location.lstrip('/'))):
for file in files:
for package in packages:
# for other package archive
if (file.startswith(package + "-") and "pkg.tar" in file and ".sig" not in file):
package_files.append(os.path.join(package_location, file))
# to avoid pacman error - duplicate target by (file.startswith(package + "-"))
package_files = set(package_files)
# to return list (for future checking data type)
package_files = list(package_files)
return package_files
def run_dracut(installation_root_path):
kernel_search_path = "/usr/lib/modules"
# find all the installed kernels and run dracut
for root, dirs, files in os.walk(os.path.join(installation_root_path, kernel_search_path.lstrip('/'))):
for file in files:
if file == "pkgbase":
kernel_version = os.path.basename(root)
# run dracut
pkgbase_location = os.path.join(root, file)
with open(pkgbase_location, 'r') as pkgbase_file:
kernel_suffix = pkgbase_file.read().rstrip()
try:
libcalamares.utils.target_env_process_output(["dracut", "--force", "--hostonly", "--no-hostonly-cmdline", f"/boot/initramfs-{kernel_suffix}.img", kernel_version])
libcalamares.utils.target_env_process_output(["dracut", "--force", "--no-hostonly", f"/boot/initramfs-{kernel_suffix}-fallback.img", kernel_version])
except subprocess.CalledProcessError as cpe:
libcalamares.utils.warning(f"dracut failed with error: {cpe.stderr}")
kernel_name = f"vmlinuz-{kernel_suffix}"
# copy kernel to boot
shutil.copy2(os.path.join(root, "vmlinuz"), os.path.join(installation_root_path, "boot", kernel_name))
def run():
if not libcalamares.job.configuration:
return "No configuration found", "Aborting due to missing configuration"
try:
gs_name = libcalamares.job.configuration["gsName"]
except KeyError:
return "Missing global storage value", "gsname not found in configuration file"
try:
offline = libcalamares.job.configuration["offline"]
except KeyError:
offline = False
pass
bootloaders = libcalamares.job.configuration.get("bootloader", [])
if libcalamares.globalstorage.contains(gs_name):
bootloader_name = libcalamares.globalstorage.value(gs_name)
else:
return f"Key missing", f"Failed to find {gs_name} in global storage"
try:
installation_root_path = libcalamares.globalstorage.value("rootMountPoint")
except KeyError:
libcalamares.utils.warning('Global storage value "rootMountPoint" missing')
packages = None
for bootloader in bootloaders:
try:
if bootloader["name"].casefold() == bootloader_name.casefold():
packages = bootloader["packages"]
except KeyError:
return f"Configuration error", f"Missing key 'name' in configuration"
# remove mkinitcpio
try:
libcalamares.utils.target_env_process_output(["pacman", "--noconfirm", "-Rcn", "mkinitcpio"])
except subprocess.CalledProcessError:
# If it isn't installed, don't trigger an error
pass
# Add the resume module for dracut
if is_resume_needed():
dracut_file_path = os.path.join(installation_root_path , "etc/dracut.conf.d/resume.conf")
resume_line = 'add_dracutmodules+=" resume "'
with open(dracut_file_path, 'w') as dracut_resume:
dracut_resume.write(resume_line + "\n")
# install packages
if offline:
package_files = get_local_packages(packages)
if package_files is not None:
try:
libcalamares.utils.target_env_process_output(["pacman", "--noconfirm", "--needed", "-U"] + package_files)
except subprocess.CalledProcessError as cpe:
return f"Failed to install packages for {bootloader_name}", f"The install failed with error: {cpe.stderr}"
else:
if packages is not None:
try:
libcalamares.utils.target_env_process_output(["pacman", "--noconfirm", "--needed", "-S"] + packages)
except subprocess.CalledProcessError as cpe:
package_files = get_local_packages(packages)
if package_files is not None:
try:
libcalamares.utils.target_env_process_output(["pacman", "--noconfirm", "--needed", "-U"] + package_files)
except subprocess.CalledProcessError as cpe:
return f"Failed to install packages for {bootloader_name}", f"The install failed with error: {cpe.stderr}"
# Run dracut unless we are using systemd-boot since kernel-install handles that
if bootloader_name.casefold().strip() != "systemd-boot":
run_dracut(installation_root_path)
return None

View File

@ -0,0 +1,7 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
---
type: "job"
name: "eos_bootloader"
interface: "python"
script: "main.py"

View File

@ -0,0 +1,67 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
#
# Create, overwrite or update /etc/default/grub in the target system.
#
# 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* (this
# string is sanitized, and see also setting *keep_distributor*)
# - 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.
---
# The variable to be evaluated from globalstorage that determines the selected bootloader
#gsName: packagechooser_bootloader
gsName: packagechooser_packagechooserq
# 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
# If set to true, prefer to write files in /etc/default/grub.d/
# rather than the single file /etc/default/grub. If this is set,
# Calamares will write /etc/default/grub.d/00Calamares instead.
prefer_grub_d: false
# If set to true, an **existing** setting for GRUB_DISTRIBUTOR is
# kept, not updated to the *bootloaderEntryName* from the branding file.
# Use this if the GRUB_DISTRIBUTOR setting in the file is "smart" in
# some way (e.g. uses shell-command substitution).
keep_distributor: false
# The default kernel params that should always be applied.
# This is an array of strings. If it is unset, the default is
# `["quiet"]`. To avoid the default, explicitly set this key
# to an empty list, `[]`.
kernel_params: [ "nvme_load=YES","nowatchdog","zswap.enabled=0","page_alloc.shuffle=1","threadirqs","split_lock_detect=off","pci=pcie_bus_perf","add_efi_memmap","quiet" ]
# Default entries to write to /etc/default/grub if it does not exist yet or if
# we are overwriting it.
#
defaults:
GRUB_TIMEOUT: 5
GRUB_TIMEOUT_STYLE: 'countdown'
GRUB_DEFAULT: "saved"
GRUB_SAVEDEFAULT: true
GRUB_DISABLE_SUBMENU: false
GRUB_DISABLE_RECOVERY: true
GRUB_TERMINAL_OUTPUT: "gfxterm"
GRUB_BACKGROUND: "/usr/share/melawy-linux/splash.png"
GRUB_GFXMODE: auto
GRUB_GFXPAYLOAD_LINUX: keep
# Set to true to force defaults to be used even when not overwriting
always_use_defaults: true

View File

@ -0,0 +1,24 @@
# SPDX-FileCopyrightText: 2020 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: GPL-3.0-or-later
---
$schema: https://json-schema.org/schema#
$id: https://calamares.io/schemas/grubcfg
additionalProperties: false
type: object
properties:
gsName: { type: string }
overwrite: { type: boolean, default: false }
keep_distributor: { type: boolean, default: false }
prefer_grub_d: { type: boolean, default: false }
kernel_params: { type: array, items: { type: string } }
defaults:
type: object
additionalProperties: true # Other fields are acceptable
properties:
GRUB_TIMEOUT: { type: integer }
GRUB_DEFAULT: { type: string }
GRUB_DISABLE_SUBMENU: { type: boolean, default: true }
GRUB_TERMINAL_OUTPUT: { type: string }
GRUB_DISABLE_RECOVERY: { type: boolean, default: true }
required: [ GRUB_TIMEOUT, GRUB_DEFAULT ]
always_use_defaults: { type: boolean, default: false }

381
src/modules/grubcfg/main.py Executable file
View File

@ -0,0 +1,381 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# === This file is part of Calamares - <https://calamares.io> ===
#
# SPDX-FileCopyrightText: 2014-2015 Philip Müller <philm@manjaro.org>
# SPDX-FileCopyrightText: 2015-2017 Teo Mrnjavac <teo@kde.org>
# SPDX-FileCopyrightText: 2017 Alf Gaida <agaida@siduction.org>
# SPDX-FileCopyrightText: 2017 2019, Adriaan de Groot <groot@kde.org>
# SPDX-FileCopyrightText: 2017-2018 Gabriel Craciunescu <crazy@frugalware.org>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# Calamares is Free Software: see the License-Identifier above.
#
import libcalamares
import fileinput
import os
import re
import shutil
import subprocess
from libcalamares.utils import check_target_env_call
import gettext
_ = gettext.translation("calamares-python",
localedir=libcalamares.utils.gettext_path(),
languages=libcalamares.utils.gettext_languages(),
fallback=True).gettext
def have_program_in_target(program : str):
"""Returns @c True if @p program is in path in the target"""
return libcalamares.utils.target_env_call(["/usr/bin/which", program]) == 0
def pretty_name():
return _("Configure GRUB.")
def get_grub_config_path(root_mount_point):
"""
Figures out where to put the grub config files. Returns
a the full path of a file inside that
directory, as "the config file".
Returns a path into @p root_mount_point.
"""
default_dir = os.path.join(root_mount_point, "etc/default")
default_config_file = "grub"
if "prefer_grub_d" in libcalamares.job.configuration and libcalamares.job.configuration["prefer_grub_d"]:
possible_dir = os.path.join(root_mount_point, "etc/default/grub.d")
if os.path.exists(possible_dir) and os.path.isdir(possible_dir):
default_dir = possible_dir
default_config_file = "00calamares"
if not os.path.exists(default_dir):
try:
os.mkdir(default_dir)
except Exception as error:
# exception as error is still redundant, but it print out the error
# identify a solution for each exception and
# if possible and code it within.
libcalamares.utils.debug(f"Failed to create {default_dir}")
libcalamares.utils.debug(f"{error}")
raise
return os.path.join(default_dir, default_config_file)
def get_zfs_root():
"""
Looks in global storage to find the zfs root
:return: A string containing the path to the zfs root or None if it is not found
"""
zfs = libcalamares.globalstorage.value("zfsDatasets")
if not zfs:
libcalamares.utils.warning("Failed to locate zfs dataset list")
return None
# Find the root dataset
for dataset in zfs:
try:
if dataset["mountpoint"] == "/":
return dataset["zpool"] + "/" + dataset["dsName"]
except KeyError:
# This should be impossible
libcalamares.utils.warning("Internal error handling zfs dataset")
raise
return None
def update_existing_config(default_grub, grub_config_items):
"""
Updates the existing grub configuration file with any items present in @p grub_config_items
Items that exist in the file will be updated and new items will be appended to the end
:param default_grub: The absolute path to the grub config file
:param grub_config_items: A dict holding the key value pairs representing the items
"""
default_grub_orig = default_grub + ".calamares"
shutil.move(default_grub, default_grub_orig)
with open(default_grub, "w") as grub_file:
with open(default_grub_orig, "r") as grub_orig_file:
for line in grub_orig_file.readlines():
line = line.strip()
if "=" in line:
# This may be a key, strip the leading comment if it has one
key = line.lstrip("#").split("=")[0].strip()
# check if this is one of the keys we care about
if key in grub_config_items.keys():
print(f"{key}={grub_config_items[key]}", file=grub_file)
del grub_config_items[key]
else:
print(line, file=grub_file)
else:
print(line, file=grub_file)
if len(grub_config_items) != 0:
for dict_key, dict_val in grub_config_items.items():
print(f"{dict_key}={dict_val}", file=grub_file)
os.remove(default_grub_orig)
def modify_grub_default(partitions, root_mount_point, distributor):
"""
Configures '/etc/default/grub' for hibernation and plymouth.
@see bootloader/main.py, for similar handling of kernel parameters
:param partitions:
:param root_mount_point:
:param distributor: name of the distributor to fill in for
GRUB_DISTRIBUTOR. Must be a string. If the job setting
*keep_distributor* is set, then this is only used if no
GRUB_DISTRIBUTOR is found at all (otherwise, when *keep_distributor*
is set, the GRUB_DISTRIBUTOR lines are left unchanged).
If *keep_distributor* is unset or false, then GRUB_DISTRIBUTOR
is always updated to set this value.
:return:
"""
default_grub = get_grub_config_path(root_mount_point)
distributor = distributor.replace("'", "'\\''")
dracut_bin = libcalamares.utils.target_env_call(
["sh", "-c", "which dracut"]
)
plymouth_bin = libcalamares.utils.target_env_call(
["sh", "-c", "which plymouth"]
)
uses_systemd_hook = libcalamares.utils.target_env_call(
["sh", "-c", "grep -q \"^HOOKS.*systemd\" /etc/mkinitcpio.conf"]
) == 0
try:
gpu_drivers = libcalamares.globalstorage.value("gpuDrivers")
except KeyError:
pass
# Shell exit value 0 means success
have_plymouth = plymouth_bin == 0
use_systemd_naming = dracut_bin == 0 or uses_systemd_hook
use_splash = ""
swap_uuid = ""
swap_outer_uuid = ""
swap_outer_mappername = None
no_save_default = False
unencrypted_separate_boot = any(p["mountPoint"] == "/boot" and "luksMapperName" not in p for p in partitions)
# If there is no dracut, and the root partition is ZFS, this gets set below
zfs_root_path = None
for partition in partitions:
if partition["mountPoint"] in ("/", "/boot") and partition["fs"] in ("btrfs", "f2fs", "zfs"):
no_save_default = True
break
if have_plymouth:
use_splash = "splash"
cryptdevice_params = []
if use_systemd_naming:
for partition in partitions:
if partition["fs"] == "linuxswap" and not partition.get("claimed", None):
# Skip foreign swap
continue
has_luks = "luksMapperName" in partition
if partition["fs"] == "linuxswap" and not has_luks:
swap_uuid = partition["uuid"]
if partition["fs"] == "linuxswap" and has_luks:
swap_outer_uuid = partition["luksUuid"]
swap_outer_mappername = partition["luksMapperName"]
if partition["mountPoint"] == "/" and has_luks:
cryptdevice_params = [f"rd.luks.uuid={partition['luksUuid']}"]
if not unencrypted_separate_boot and uses_systemd_hook:
cryptdevice_params.append("rd.luks.key=/crypto_keyfile.bin")
else:
for partition in partitions:
if partition["fs"] == "linuxswap" and not partition.get("claimed", None):
# Skip foreign swap
continue
has_luks = "luksMapperName" in partition
if partition["fs"] == "linuxswap" and not has_luks:
swap_uuid = partition["uuid"]
if partition["fs"] == "linuxswap" and has_luks:
swap_outer_mappername = partition["luksMapperName"]
if partition["mountPoint"] == "/" and has_luks:
cryptdevice_params = [
f"cryptdevice=UUID={partition['luksUuid']}:{partition['luksMapperName']}",
f"root=/dev/mapper/{partition['luksMapperName']}"
]
if partition["fs"] == "zfs" and partition["mountPoint"] == "/":
zfs_root_path = get_zfs_root()
kernel_params = libcalamares.job.configuration.get("kernel_params", ["quiet"])
if have_program_in_target("plymouth"):
kernel_params.append("splash")
kernel_params.append("bgrt_disable")
# Currently, grub doesn't detect this properly so it must be set manually
if zfs_root_path:
kernel_params.insert(0, "zfs=" + zfs_root_path)
if cryptdevice_params:
kernel_params.extend(cryptdevice_params)
if use_splash:
kernel_params.append(use_splash)
if swap_uuid:
kernel_params.append(f"resume=UUID={swap_uuid}")
if use_systemd_naming and swap_outer_uuid:
kernel_params.append(f"rd.luks.uuid={swap_outer_uuid}")
if swap_outer_mappername:
kernel_params.append(f"resume=/dev/mapper/{swap_outer_mappername}")
if "nvidia" in gpu_drivers:
kernel_params.append("nvidia")
kernel_params.append("nvidia-drm.modeset=1")
kernel_params.append("nvidia-drm.fbdev=1")
kernel_params.append("nouveau.modeset=0")
# kernel_params.append("modprobe.blacklist=nouveau")
kernel_params.append("i915.modeset=1")
kernel_params.append("radeon.modeset=1")
elif "nouveau" in gpu_drivers:
kernel_params.append("nvidia")
kernel_params.append("nvidia-drm.modeset=1")
kernel_params.append("nvidia-drm.fbdev=1")
kernel_params.append("nouveau.modeset=0")
# kernel_params.append("modprobe.blacklist=nouveau")
kernel_params.append("i915.modeset=1")
kernel_params.append("radeon.modeset=1")
overwrite = libcalamares.job.configuration.get("overwrite", False)
grub_config_items = {}
# read the lines we need from the existing config
if os.path.exists(default_grub) and not overwrite:
with open(default_grub, 'r') as grub_file:
lines = [x.strip() for x in grub_file.readlines()]
for line in lines:
if line.startswith("GRUB_CMDLINE_LINUX_DEFAULT"):
existing_params = re.sub(r"^GRUB_CMDLINE_LINUX_DEFAULT\s*=\s*", "", line).strip("\"'").split()
for existing_param in existing_params:
existing_param_name = existing_param.split("=")[0].strip()
# Ensure we aren't adding duplicated params
param_exists = False
for param in kernel_params:
if param.split("=")[0].strip() == existing_param_name:
param_exists = True
break
if not param_exists and existing_param_name not in ["quiet", "resume", "splash"]:
kernel_params.append(existing_param)
elif line.startswith("GRUB_DISTRIBUTOR") and libcalamares.job.configuration.get("keep_distributor", False):
distributor_parts = line.split("=")
if len(distributor_parts) > 1:
distributor = distributor_parts[1].strip("'\"")
# If a filesystem grub can't write to is used, disable save default
if no_save_default and line.strip().startswith("GRUB_SAVEDEFAULT"):
grub_config_items["GRUB_SAVEDEFAULT"] = "false"
always_use_defaults = libcalamares.job.configuration.get("always_use_defaults", False)
# If applicable add the items from defaults to the dict containing the grub config to wirte/modify
if always_use_defaults or overwrite or not os.path.exists(default_grub):
if "defaults" in libcalamares.job.configuration:
for key, value in libcalamares.job.configuration["defaults"].items():
if isinstance(value, bool):
if value:
escaped_value = "true"
else:
escaped_value = "false"
else:
escaped_value = str(value).replace("'", "'\\''")
grub_config_items[key] = f"'{escaped_value}'"
grub_config_items['GRUB_CMDLINE_LINUX_DEFAULT'] = f"'{' '.join(kernel_params)}'"
grub_config_items["GRUB_DISTRIBUTOR"] = f"'{distributor}'"
if cryptdevice_params and not unencrypted_separate_boot:
grub_config_items["GRUB_ENABLE_CRYPTODISK"] = "y"
if overwrite or not os.path.exists(default_grub) or libcalamares.job.configuration.get("prefer_grub_d", False):
with open(default_grub, 'w') as grub_file:
for key, value in grub_config_items.items():
grub_file.write(f"{key}={value}\n")
else:
update_existing_config(default_grub, grub_config_items)
return None
def run():
"""
Calls routine with given parameters to modify '/etc/default/grub'.
:return:
"""
if not libcalamares.job.configuration:
return "No configuration found", "Aborting due to missing configuration"
try:
gs_name = libcalamares.job.configuration["gsName"]
except KeyError:
return "Missing global storage value", "gsname not found in configuration file"
if libcalamares.globalstorage.contains(gs_name):
bootloader_name = libcalamares.globalstorage.value(gs_name)
else:
return f"Key missing", f"Failed to find {gs_name} in global storage"
if bootloader_name != "grub":
libcalamares.utils.debug("Bootloader is not grub, skipping grub configuration")
return None
fw_type = libcalamares.globalstorage.value("firmwareType")
partitions = libcalamares.globalstorage.value("partitions")
root_mount_point = libcalamares.globalstorage.value("rootMountPoint")
branding = libcalamares.globalstorage.value("branding")
if branding is None:
distributor = None
else:
distributor = branding["bootloaderEntryName"]
if libcalamares.globalstorage.value("bootLoader") is None and fw_type != "efi":
return None
if fw_type == "efi":
esp_found = False
for partition in partitions:
if partition["mountPoint"] == libcalamares.globalstorage.value("efiSystemPartition"):
esp_found = True
if not esp_found:
return None
return modify_grub_default(partitions, root_mount_point, distributor)

View File

@ -0,0 +1,60 @@
#!/usr/bin/env python3
import subprocess
import libcalamares
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
custom_status_message = None
name = "Hardware detection"
def pretty_name():
return _(name)
def pretty_status_message():
if custom_status_message is not None:
return custom_status_message
def run():
cpu_model = "unknown"
cpu_vendor = "unknown"
gpu_drivers = []
try:
with open("/proc/cpuinfo", "r") as cpu_file:
for line in cpu_file:
if line.strip().startswith("vendor_id"):
cpu_vendor = line.split(":")[1].strip()
if line.strip().startswith("model name"):
cpu_model = line.split(":")[1].strip()
except KeyError:
libcalamares.utils.warning("Failed to get CPU drivers")
try:
lspci_output = subprocess.run("LANG=C lspci -k | grep -EA3 'VGA|3D|Display'",
capture_output=True, shell=True, text=True)
for line in lspci_output.stdout.split("\n"):
if line.strip().startswith("Kernel driver in use:"):
gpu_drivers.append(line.split(":")[1].strip())
except subprocess.CalledProcessError as cpe:
libcalamares.utils.warning(f"Failed to get GPU drivers with error: {cpe.output}")
except KeyError:
libcalamares.utils.warning("Failed to parse GPU driver string")
libcalamares.globalstorage.insert("cpuModel", cpu_model)
libcalamares.globalstorage.insert("cpuVendor", cpu_vendor)
libcalamares.globalstorage.insert("gpuDrivers", gpu_drivers)
return None

View File

@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: no
# SPDX-License-Identifier: CC0-1.0
---
type: "job"
name: "hardwaredetect"
interface: "python"
script: "main.py"
noconfig: true

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

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