Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/python-build.yml4
-rw-r--r--.github/workflows/python-publish.yml2
-rw-r--r--PKGBUILD41
-rw-r--r--README.md3
-rw-r--r--archinstall/__init__.py17
-rw-r--r--archinstall/lib/configuration.py5
-rw-r--r--archinstall/lib/disk/encryption.py26
-rw-r--r--archinstall/lib/disk/filesystem.py2
-rw-r--r--archinstall/lib/disk/helpers.py88
-rw-r--r--archinstall/lib/disk/mapperdev.py4
-rw-r--r--archinstall/lib/disk/partition.py133
-rw-r--r--archinstall/lib/disk/validators.py6
-rw-r--r--archinstall/lib/general.py50
-rw-r--r--archinstall/lib/hsm/fido.py21
-rw-r--r--archinstall/lib/installer.py237
-rw-r--r--archinstall/lib/luks.py2
-rw-r--r--archinstall/lib/menu/abstract_menu.py20
-rw-r--r--archinstall/lib/menu/global_menu.py14
-rw-r--r--archinstall/lib/models/disk_encryption.py59
-rw-r--r--archinstall/lib/packages/packages.py3
-rw-r--r--archinstall/lib/systemd.py2
-rw-r--r--archinstall/lib/user_interaction/general_conf.py3
-rw-r--r--archinstall/lib/user_interaction/partitioning_conf.py4
-rw-r--r--archinstall/lib/user_interaction/save_conf.py92
-rw-r--r--archinstall/lib/user_interaction/system_conf.py1
-rw-r--r--archinstall/locales/ar/LC_MESSAGES/base.po46
-rw-r--r--archinstall/locales/base.pot39
-rw-r--r--archinstall/locales/cs/LC_MESSAGES/base.mobin26460 -> 26115 bytes
-rw-r--r--archinstall/locales/cs/LC_MESSAGES/base.po60
-rw-r--r--archinstall/locales/de/LC_MESSAGES/base.mobin23285 -> 23304 bytes
-rw-r--r--archinstall/locales/de/LC_MESSAGES/base.po56
-rw-r--r--archinstall/locales/el/LC_MESSAGES/base.mobin35979 -> 35562 bytes
-rw-r--r--archinstall/locales/el/LC_MESSAGES/base.po60
-rw-r--r--archinstall/locales/en/LC_MESSAGES/base.po46
-rw-r--r--archinstall/locales/es/LC_MESSAGES/base.mobin24797 -> 24393 bytes
-rw-r--r--archinstall/locales/es/LC_MESSAGES/base.po62
-rw-r--r--archinstall/locales/fr/LC_MESSAGES/base.mobin25482 -> 27591 bytes
-rw-r--r--archinstall/locales/fr/LC_MESSAGES/base.po114
-rw-r--r--archinstall/locales/id/LC_MESSAGES/base.mobin26367 -> 27433 bytes
-rw-r--r--archinstall/locales/id/LC_MESSAGES/base.po61
-rw-r--r--archinstall/locales/it/LC_MESSAGES/base.mobin27015 -> 26675 bytes
-rw-r--r--archinstall/locales/it/LC_MESSAGES/base.po51
-rw-r--r--archinstall/locales/ka/LC_MESSAGES/base.mobin0 -> 44957 bytes
-rw-r--r--archinstall/locales/ka/LC_MESSAGES/base.po878
-rw-r--r--archinstall/locales/ko/LC_MESSAGES/base.mobin27798 -> 27355 bytes
-rw-r--r--archinstall/locales/ko/LC_MESSAGES/base.po54
-rw-r--r--archinstall/locales/languages.json4
-rw-r--r--archinstall/locales/nl/LC_MESSAGES/base.mobin18002 -> 17688 bytes
-rw-r--r--archinstall/locales/nl/LC_MESSAGES/base.po62
-rw-r--r--archinstall/locales/pl/LC_MESSAGES/base.mobin25880 -> 25444 bytes
-rw-r--r--archinstall/locales/pl/LC_MESSAGES/base.po68
-rw-r--r--archinstall/locales/pt/LC_MESSAGES/base.mobin16667 -> 16333 bytes
-rw-r--r--archinstall/locales/pt/LC_MESSAGES/base.po62
-rw-r--r--archinstall/locales/pt_BR/LC_MESSAGES/base.mobin26802 -> 26469 bytes
-rw-r--r--archinstall/locales/pt_BR/LC_MESSAGES/base.po51
-rw-r--r--archinstall/locales/ru/LC_MESSAGES/base.mobin35756 -> 35760 bytes
-rw-r--r--archinstall/locales/ru/LC_MESSAGES/base.po57
-rw-r--r--archinstall/locales/sv/LC_MESSAGES/base.mobin23045 -> 22729 bytes
-rw-r--r--archinstall/locales/sv/LC_MESSAGES/base.po62
-rw-r--r--archinstall/locales/ta/LC_MESSAGES/base.mobin48222 -> 47610 bytes
-rw-r--r--archinstall/locales/ta/LC_MESSAGES/base.po60
-rw-r--r--archinstall/locales/tr/LC_MESSAGES/base.mobin24757 -> 24422 bytes
-rw-r--r--archinstall/locales/tr/LC_MESSAGES/base.po60
-rw-r--r--archinstall/locales/uk/LC_MESSAGES/base.mobin36644 -> 36158 bytes
-rw-r--r--archinstall/locales/uk/LC_MESSAGES/base.po20
-rw-r--r--archinstall/locales/ur/LC_MESSAGES/base.mobin20880 -> 20487 bytes
-rw-r--r--archinstall/locales/ur/LC_MESSAGES/base.po62
-rw-r--r--archinstall/locales/zh-CN/LC_MESSAGES/base.mobin24513 -> 24126 bytes
-rw-r--r--archinstall/locales/zh-CN/LC_MESSAGES/base.po54
-rw-r--r--docs/examples/python.rst6
-rw-r--r--docs/installing/guided.rst4
-rw-r--r--examples/guided.py46
-rw-r--r--profiles/budgie.py8
-rw-r--r--profiles/i3.py46
-rw-r--r--profiles/sway.py39
-rw-r--r--pyproject.toml31
-rw-r--r--setup.cfg39
-rw-r--r--setup.py3
78 files changed, 2667 insertions, 543 deletions
diff --git a/.github/workflows/python-build.yml b/.github/workflows/python-build.yml
index 4cd32a93..647ad70e 100644
--- a/.github/workflows/python-build.yml
+++ b/.github/workflows/python-build.yml
@@ -19,8 +19,8 @@ jobs:
pip install build twine
- name: Build archinstall
run: |
- python -m build
+ python -m build . --wheel
- uses: actions/upload-artifact@v3
with:
name: archinstall
- path: dist/*
+ path: dist/* \ No newline at end of file
diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml
index dd25a105..8a5bd679 100644
--- a/.github/workflows/python-publish.yml
+++ b/.github/workflows/python-publish.yml
@@ -24,7 +24,7 @@ jobs:
pip install build twine
- name: Build archinstall
run: |
- python -m build
+ python -m build . --wheel
- name: Publish archinstall to PyPi
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
diff --git a/PKGBUILD b/PKGBUILD
index d8e89ae2..08c2001b 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,44 +4,63 @@
# Contributor: demostanis worlds <demostanis@protonmail.com>
pkgname=archinstall
-pkgver=2.5.0
-#pkgver=$(git describe --long | sed 's/\([^-]*-g\)/r\1/;s/-/./g')
+pkgver=2.5.4
pkgrel=1
pkgdesc="Just another guided/automated Arch Linux installer with a twist"
arch=(any)
url="https://github.com/archlinux/archinstall"
license=(GPL3)
-depends=(python)
-makedepends=(python-build python-installer python-flit python-setuptools python-sphinx python-wheel)
-provides=(python-archinstall)
-conflicts=(python-archinstall)
-replaces=(python-archinstall)
+depends=(
+ 'python'
+ 'systemd'
+)
+makedepends=(
+ 'python-setuptools'
+ 'python-sphinx'
+ 'python-build'
+ 'python-installer'
+ 'python-wheel'
+)
+optdepends=(
+ 'python-systemd: Adds journald logging'
+)
+provides=(python-archinstall archinstall)
+conflicts=(python-archinstall archinstall-git)
+replaces=(python-archinstall archinstall-git)
source=(
$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz
$pkgname-$pkgver.tar.gz.sig::$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz.sig
)
-sha512sums=('9516719c4e4fe0423224a35b4846cf5c8daeb931cff6fed588957840edc5774e9c6fe18619d2356a6d76681ae3216ba19f5d0f0bd89c6301b4ff9b128d037d13'
+sha512sums=('64cb3593c5091b3885ad14ef073cfab31090b4f9bcb4405b18cf9b19adb5ca42255ba8891ec62e21f92d59872541ef6d94f186fb05c625822af63525441e08d9'
'SKIP')
-b2sums=('a29ae767756f74ce296d53e31bb8376cfa7db19a53b8c3997b2d8747a60842ba88e8b18c505bc56a36d685f73f7a6d9e53adff17953c8a4ebaabc67c6db8e583'
+b2sums=('9c0ec0871841804377ba8310dc744711adcec4eed7319a8d89d684af8e7b822bb9d47540b00f4d746a9fcd7b9ea1b9e07bac773e6c28fabc760e4df38b16748b'
'SKIP')
validpgpkeys=('256F73CEEFC6705C6BBAB20E5FBBB32941E3740A') # Anton Hvornum (Torxed) <anton@hvornum.se>
+pkgver() {
+ cd $pkgname-$pkgver
+
+ awk '$1 ~ /^__version__/ {gsub("\"", ""); print $3}' archinstall/__init__.py
+}
+
prepare() {
cd $pkgname-$pkgver
+
# use real directories for examples and profiles, as symlinks do not work
- # with flit or setuptools PEP517 backends
rm -fv $pkgname/{examples,profiles}
mv -v examples profiles $pkgname/
}
build() {
cd $pkgname-$pkgver
+
python -m build --wheel --no-isolation
PYTHONDONTWRITEBYTECODE=1 make man -C docs
}
package() {
cd "$pkgname-$pkgver"
+
python -m installer --destdir="$pkgdir" dist/*.whl
install -vDm 644 docs/_build/man/archinstall.1 -t "$pkgdir/usr/share/man/man1/"
-} \ No newline at end of file
+}
diff --git a/README.md b/README.md
index 78787dec..d83a8901 100644
--- a/README.md
+++ b/README.md
@@ -46,7 +46,7 @@ English
Deutsch
Español
Français
-Indonesia
+Indonesian
Italiano
Nederlands
Polskie
@@ -168,6 +168,7 @@ you can replace the version of archinstall with a new version and run that with
5. Enter the repository with `cd archinstall`
*At this stage, you can choose to check out a feature branch for instance with `git checkout v2.3.1-rc1`*
6. Build the project and install it using `python setup.py install`
+ *If you get a 'No Module named setuptools' error, run `pacman -S python-setuptools`*
After this, running archinstall with `python -m archinstall` will run against whatever branch you chose in step 5.
diff --git a/archinstall/__init__.py b/archinstall/__init__.py
index e496d213..9de4a3ec 100644
--- a/archinstall/__init__.py
+++ b/archinstall/__init__.py
@@ -47,7 +47,7 @@ from .lib.configuration import *
from .lib.udev import udevadm_info
parser = ArgumentParser()
-__version__ = "2.5.2"
+__version__ = "2.5.4"
storage['__version__'] = __version__
# add the custome _ as a builtin, it can now be used anywhere in the
@@ -221,11 +221,8 @@ def load_config():
selected_region = arguments.get('mirror-region', None)
arguments['mirror-region'] = {selected_region: list_mirrors()[selected_region]}
- if arguments.get('sys-language', None) is not None:
- arguments['sys-language'] = arguments.get('sys-language', 'en_US')
-
- if arguments.get('sys-encoding', None) is not None:
- arguments['sys-encoding'] = arguments.get('sys-encoding', 'utf-8')
+ arguments.setdefault('sys-language', 'en_US')
+ arguments.setdefault('sys-encoding', 'utf-8')
if arguments.get('gfx_driver', None) is not None:
storage['gfx_driver_packages'] = AVAILABLE_GFX_DRIVERS.get(arguments.get('gfx_driver', None), None)
@@ -243,6 +240,14 @@ def load_config():
superusers = arguments.get('!superusers', None)
arguments['!users'] = User.parse_arguments(users, superusers)
+ if arguments.get('disk_encryption', None) is not None and arguments.get('disk_layouts', None) is not None:
+ password = arguments.get('encryption_password', '')
+ arguments['disk_encryption'] = DiskEncryption.parse_arg(
+ arguments['disk_layouts'],
+ arguments['disk_encryption'],
+ password
+ )
+
def post_process_arguments(arguments):
storage['arguments'] = arguments
diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py
index ad537b21..c036783f 100644
--- a/archinstall/lib/configuration.py
+++ b/archinstall/lib/configuration.py
@@ -44,7 +44,7 @@ class ConfigurationOutput:
self._disk_layout_file = "user_disk_layout.json"
self._sensitive = ['!users']
- self._ignore = ['abort', 'install', 'config', 'creds', 'dry_run', 'disk_encryption']
+ self._ignore = ['abort', 'install', 'config', 'creds', 'dry_run']
self._process_config()
@@ -71,6 +71,9 @@ class ConfigurationOutput:
else:
self._user_config[key] = self._config[key]
+ if key == 'disk_encryption' and self._config[key]: # special handling for encryption password
+ self._user_credentials['encryption_password'] = self._config[key].encryption_password
+
def user_config_to_json(self) -> str:
return json.dumps({
'config_version': storage['__version__'], # Tells us what version was used to generate the config
diff --git a/archinstall/lib/disk/encryption.py b/archinstall/lib/disk/encryption.py
index 67f656c8..c7496bfa 100644
--- a/archinstall/lib/disk/encryption.py
+++ b/archinstall/lib/disk/encryption.py
@@ -46,7 +46,7 @@ class DiskEncryptionMenu(AbstractSubMenu):
Selector(
_('Partitions'),
func=lambda preset: select_partitions_to_encrypt(self._disk_layouts, preset),
- display_func=lambda x: f'{len(x)} {_("Partitions")}' if x else None,
+ display_func=lambda x: f'{sum([len(y) for y in x.values()])} {_("Partitions")}' if x else None,
dependencies=['encryption_password'],
default=self._preset.partitions,
preview_func=self._prev_disk_layouts,
@@ -86,9 +86,14 @@ class DiskEncryptionMenu(AbstractSubMenu):
def _prev_disk_layouts(self) -> Optional[str]:
selector = self._menu_options['partitions']
if selector.has_selection():
- partitions: List[Any] = selector.current_selection
+ partitions: Dict[str, Any] = selector.current_selection
+
+ all_partitions = []
+ for parts in partitions.values():
+ all_partitions += parts
+
output = str(_('Partitions to be encrypted')) + '\n'
- output += current_partition_layout(partitions, with_title=False)
+ output += current_partition_layout(all_partitions, with_title=False)
return output.rstrip()
return None
@@ -132,7 +137,7 @@ def select_hsm(preset: Optional[Fido2Device] = None) -> Optional[Fido2Device]:
return None
-def select_partitions_to_encrypt(disk_layouts: Dict[str, Any], preset: List[Any]) -> List[Any]:
+def select_partitions_to_encrypt(disk_layouts: Dict[str, Any], preset: Dict[str, Any]) -> Dict[str, Any]:
# If no partitions was marked as encrypted, but a password was supplied and we have some disks to format..
# Then we need to identify which partitions to encrypt. This will default to / (root).
all_partitions = []
@@ -153,10 +158,17 @@ def select_partitions_to_encrypt(disk_layouts: Dict[str, Any], preset: List[Any]
match choice.type_:
case MenuSelectionType.Reset:
- return []
+ return {}
case MenuSelectionType.Skip:
return preset
case MenuSelectionType.Selection:
- return choice.value # type: ignore
+ selections: List[Any] = choice.value # type: ignore
+ partitions = {}
+
+ for path, device in disk_layouts.items():
+ for part in selections:
+ if part in device.get('partitions', []):
+ partitions.setdefault(path, []).append(part)
- return []
+ return partitions
+ return {}
diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py
index bdfa502a..1083df53 100644
--- a/archinstall/lib/disk/filesystem.py
+++ b/archinstall/lib/disk/filesystem.py
@@ -113,7 +113,7 @@ class Filesystem:
format_options = partition.get('options',[]) + partition.get('filesystem',{}).get('format_options',[])
disk_encryption: DiskEncryption = storage['arguments'].get('disk_encryption')
- if partition in disk_encryption.partitions:
+ if disk_encryption and partition in disk_encryption.all_partitions:
if not partition['device_instance']:
raise DiskError(f"Internal error caused us to loose the partition. Please report this issue upstream!")
diff --git a/archinstall/lib/disk/helpers.py b/archinstall/lib/disk/helpers.py
index a5164b76..80d0cb53 100644
--- a/archinstall/lib/disk/helpers.py
+++ b/archinstall/lib/disk/helpers.py
@@ -212,6 +212,47 @@ def all_disks() -> List[BlockDevice]:
log(f"[Deprecated] archinstall.all_disks() is deprecated. Use archinstall.all_blockdevices() with the appropriate filters instead.", level=logging.WARNING, fg="yellow")
return all_blockdevices(partitions=False, mappers=False)
+def get_blockdevice_info(device_path, exclude_iso_dev :bool = True) -> Dict[str, Any]:
+ for retry_attempt in range(storage['DISK_RETRY_ATTEMPTS']):
+ partprobe(device_path)
+ time.sleep(max(0.1, storage['DISK_TIMEOUTS'] * retry_attempt))
+
+ try:
+ if exclude_iso_dev:
+ # exclude all devices associated with the iso boot locations
+ iso_devs = ['/run/archiso/airootfs', '/run/archiso/bootmnt']
+
+ try:
+ lsblk_info = get_lsblk_info(device_path)
+ except DiskError:
+ continue
+
+ if any([dev in lsblk_info.mountpoints for dev in iso_devs]):
+ continue
+
+ information = blkid(f'blkid -p -o export {device_path}')
+ return enrich_blockdevice_information(information)
+ except SysCallError as ex:
+ if ex.exit_code == 2:
+ # Assume that it's a loop device, and try to get info on it
+ try:
+ resolved_device_name = device_path.readlink().name
+ except OSError:
+ resolved_device_name = device_path.name
+
+ try:
+ information = get_loop_info(device_path)
+ if not information:
+ raise SysCallError(f"Could not get loop information for {resolved_device_name}", exit_code=1)
+ return enrich_blockdevice_information(information)
+
+ except SysCallError:
+ information = get_blockdevice_uevent(resolved_device_name)
+ return enrich_blockdevice_information(information)
+ else:
+ # We could not reliably get any information, perhaps the disk is clean of information?
+ if retry_attempt == storage['DISK_RETRY_ATTEMPTS'] - 1:
+ raise ex
def all_blockdevices(
mappers: bool = False,
@@ -230,40 +271,18 @@ def all_blockdevices(
# we'll iterate the /sys/class definitions and find the information
# from there.
for block_device in glob.glob("/sys/class/block/*"):
- device_path = pathlib.Path(f"/dev/{pathlib.Path(block_device).readlink().name}")
+ try:
+ device_path = pathlib.Path(f"/dev/{pathlib.Path(block_device).readlink().name}")
+ except FileNotFoundError:
+ log(f"Unknown device found by '/sys/class/block/*', ignoring: {device_path}", level=logging.WARNING, fg="yellow")
if device_path.exists() is False:
log(f"Unknown device found by '/sys/class/block/*', ignoring: {device_path}", level=logging.WARNING, fg="yellow")
continue
- try:
- if exclude_iso_dev:
- # exclude all devices associated with the iso boot locations
- iso_devs = ['/run/archiso/airootfs', '/run/archiso/bootmnt']
- lsblk_info = get_lsblk_info(device_path)
- if any([dev in lsblk_info.mountpoints for dev in iso_devs]):
- continue
-
- information = blkid(f'blkid -p -o export {device_path}')
- except SysCallError as ex:
- if ex.exit_code in (512, 2):
- # Assume that it's a loop device, and try to get info on it
- try:
- information = get_loop_info(device_path)
- if not information:
- print("Exit code for blkid -p -o export was:", ex.exit_code)
- raise SysCallError("Could not get loop information", exit_code=1)
-
- except SysCallError:
- print("Not a loop device, trying uevent rules.")
- information = get_blockdevice_uevent(pathlib.Path(block_device).readlink().name)
- else:
- # We could not reliably get any information, perhaps the disk is clean of information?
- print("Raising ex because:", ex.exit_code)
- raise ex
- # return instances
-
- information = enrich_blockdevice_information(information)
+ information = get_blockdevice_info(device_path)
+ if not information:
+ continue
for path, path_info in information.items():
if path_info.get('DMCRYPT_NAME'):
@@ -409,7 +428,6 @@ def get_partitions_in_use(mountpoint :str) -> Dict[str, Any]:
return {}
output = json.loads(output)
- # print(output)
mounts = {}
@@ -421,11 +439,13 @@ def get_partitions_in_use(mountpoint :str) -> Dict[str, Any]:
continue
if isinstance(blockdev, Partition):
- for blockdev_mountpoint in blockdev.mountpoints:
- block_devices_mountpoints[blockdev_mountpoint] = blockdev
+ if blockdev.mountpoints:
+ for blockdev_mountpoint in blockdev.mountpoints:
+ block_devices_mountpoints[blockdev_mountpoint] = blockdev
else:
- for blockdev_mountpoint in blockdev.mount_information:
- block_devices_mountpoints[blockdev_mountpoint['target']] = blockdev
+ if blockdev.mount_information:
+ for blockdev_mountpoint in blockdev.mount_information:
+ block_devices_mountpoints[blockdev_mountpoint['target']] = blockdev
log(f'Filtering available mounts {block_devices_mountpoints} to those under {mountpoint}', level=logging.DEBUG)
diff --git a/archinstall/lib/disk/mapperdev.py b/archinstall/lib/disk/mapperdev.py
index 71ef2a79..bf1b3583 100644
--- a/archinstall/lib/disk/mapperdev.py
+++ b/archinstall/lib/disk/mapperdev.py
@@ -25,6 +25,10 @@ class MapperDev:
return f"/dev/mapper/{self.mappername}"
@property
+ def part_uuid(self):
+ return self.partition.part_uuid
+
+ @property
def partition(self):
from .helpers import uevent, get_parent_of_partition
from .partition import Partition
diff --git a/archinstall/lib/disk/partition.py b/archinstall/lib/disk/partition.py
index 9febf102..87eaa6a7 100644
--- a/archinstall/lib/disk/partition.py
+++ b/archinstall/lib/disk/partition.py
@@ -98,17 +98,18 @@ class Partition:
if mountpoint:
self.mount(mountpoint)
- self._partition_info = self._fetch_information()
-
- if not autodetect_filesystem and filesystem:
- self._partition_info.filesystem_type = filesystem
+ try:
+ self._partition_info = self._fetch_information()
+
+ if not autodetect_filesystem and filesystem:
+ self._partition_info.filesystem_type = filesystem
- if self._partition_info.filesystem_type == 'crypto_LUKS':
- self._encrypted = True
+ if self._partition_info.filesystem_type == 'crypto_LUKS':
+ self._encrypted = True
+ except DiskError:
+ self._partition_info = None
- # I hate doint this but I'm currently unsure where this
- # is acutally used to be able to fix the typing issues properly
- @typing.no_type_check
+ @typing.no_type_check # I hate doint this but I'm currently unsure where this is used.
def __lt__(self, left_comparitor :BlockDevice) -> bool:
if type(left_comparitor) == Partition:
left_comparitor = left_comparitor.path
@@ -120,14 +121,17 @@ class Partition:
def __repr__(self, *args :str, **kwargs :str) -> str:
mount_repr = ''
- if mountpoint := self._partition_info.get_first_mountpoint():
- mount_repr = f", mounted={mountpoint}"
- elif self._target_mountpoint:
- mount_repr = f", rel_mountpoint={self._target_mountpoint}"
+ if self._partition_info:
+ if mountpoint := self._partition_info.get_first_mountpoint():
+ mount_repr = f", mounted={mountpoint}"
+ elif self._target_mountpoint:
+ mount_repr = f", rel_mountpoint={self._target_mountpoint}"
classname = self.__class__.__name__
- if self._encrypted:
+ if not self._partition_info:
+ return f'{classname}(path={self._path})'
+ elif self._encrypted:
return f'{classname}(path={self._path}, size={self.size}, PARTUUID={self.part_uuid}, parent={self.real_device}, fs={self._partition_info.filesystem_type}{mount_repr})'
else:
return f'{classname}(path={self._path}, size={self.size}, PARTUUID={self.part_uuid}, fs={self._partition_info.filesystem_type}{mount_repr})'
@@ -146,7 +150,7 @@ class Partition:
'encrypted': self._encrypted,
'start': self.start,
'size': self.end,
- 'filesystem': self._partition_info.filesystem_type
+ 'filesystem': self._partition_info.filesystem_type if self._partition_info else 'Unknown'
}
return partition_info
@@ -164,34 +168,37 @@ class Partition:
'start': self.start,
'size': self.end,
'filesystem': {
- 'format': self._partition_info.filesystem_type
+ 'format': self._partition_info.filesystem_type if self._partition_info else 'None'
}
}
def _call_lsblk(self) -> Dict[str, Any]:
- self.partprobe()
- # This sleep might be overkill, but lsblk is known to
- # work against a chaotic cache that can change during call
- # causing no information to be returned (blkid is better)
- # time.sleep(1)
+ for retry_attempt in range(storage['DISK_RETRY_ATTEMPTS']):
+ self.partprobe()
+ time.sleep(max(0.1, storage['DISK_TIMEOUTS'] * retry_attempt)) # TODO: Remove, we should be relying on blkid instead of lsblk
+ # This sleep might be overkill, but lsblk is known to
+ # work against a chaotic cache that can change during call
+ # causing no information to be returned (blkid is better)
+ # time.sleep(1)
- # TODO: Maybe incorporate a re-try system here based on time.sleep(max(0.1, storage.get('DISK_TIMEOUTS', 1)))
+ # TODO: Maybe incorporate a re-try system here based on time.sleep(max(0.1, storage.get('DISK_TIMEOUTS', 1)))
- try:
- output = SysCommand(f"lsblk --json -b -o+LOG-SEC,SIZE,PTTYPE,PARTUUID,UUID,FSTYPE {self.device_path}").decode('UTF-8')
- except SysCallError as error:
- # It appears as if lsblk can return exit codes like 8192 to indicate something.
- # But it does return output so we'll try to catch it.
- output = error.worker.decode('UTF-8')
-
- if output:
try:
- lsblk_info = json.loads(output)
- return lsblk_info
- except json.decoder.JSONDecodeError:
- log(f"Could not decode JSON: {output}", fg="red", level=logging.ERROR)
-
- raise DiskError(f'Failed to read disk "{self.device_path}" with lsblk')
+ output = SysCommand(f"lsblk --json -b -o+LOG-SEC,SIZE,PTTYPE,PARTUUID,UUID,FSTYPE {self.device_path}").decode('UTF-8')
+ except SysCallError as error:
+ # Get the output minus the message/info from lsblk if it returns a non-zero exit code.
+ output = error.worker.decode('UTF-8')
+ if '{' in output:
+ output = output[output.find('{'):]
+
+ if output:
+ try:
+ lsblk_info = json.loads(output)
+ return lsblk_info
+ except json.decoder.JSONDecodeError:
+ log(f"Could not decode JSON: {output}", fg="red", level=logging.ERROR)
+
+ raise DiskError(f'Failed to get partition information "{self.device_path}" with lsblk')
def _call_sfdisk(self) -> Dict[str, Any]:
output = SysCommand(f"sfdisk --json {self.block_device.path}").decode('UTF-8')
@@ -212,9 +219,12 @@ class Partition:
lsblk_info = self._call_lsblk()
sfdisk_info = self._call_sfdisk()
- if not (device := lsblk_info.get('blockdevices', [None])[0]):
+ if not (device := lsblk_info.get('blockdevices', [])):
raise DiskError(f'Failed to retrieve information for "{self.device_path}" with lsblk')
+ # Grab the first (and only) block device in the list as we're targeting a specific partition
+ device = device[0]
+
mountpoints = [Path(mountpoint) for mountpoint in device['mountpoints'] if mountpoint]
bootable = sfdisk_info.get('bootable', False) or sfdisk_info.get('type', '') == 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B'
@@ -243,7 +253,8 @@ class Partition:
@property
def filesystem(self) -> str:
- return self._partition_info.filesystem_type
+ if self._partition_info:
+ return self._partition_info.filesystem_type
@property
def mountpoint(self) -> Optional[Path]:
@@ -253,43 +264,51 @@ class Partition:
@property
def mountpoints(self) -> List[Path]:
- return self._partition_info.mountpoints
+ if self._partition_info:
+ return self._partition_info.mountpoints
@property
def sector_size(self) -> int:
- return self._partition_info.sector_size
+ if self._partition_info:
+ return self._partition_info.sector_size
@property
def start(self) -> Optional[int]:
- return self._partition_info.start
+ if self._partition_info:
+ return self._partition_info.start
@property
def end(self) -> Optional[int]:
- return self._partition_info.end
+ if self._partition_info:
+ return self._partition_info.end
@property
def end_sectors(self) -> Optional[int]:
- start = self._partition_info.start
- end = self._partition_info.end
- if start and end:
- return start + end
- return None
+ if self._partition_info:
+ start = self._partition_info.start
+ end = self._partition_info.end
+ if start and end:
+ return start + end
@property
def size(self) -> Optional[float]:
- return self._partition_info.size
+ if self._partition_info:
+ return self._partition_info.size
@property
def boot(self) -> bool:
- return self._partition_info.bootable
+ if self._partition_info:
+ return self._partition_info.bootable
@property
def partition_type(self) -> Optional[str]:
- return self._partition_info.pttype
+ if self._partition_info:
+ return self._partition_info.pttype
@property
def part_uuid(self) -> str:
- return self._partition_info.partuuid
+ if self._partition_info:
+ return self._partition_info.partuuid
@property
def uuid(self) -> Optional[str]:
@@ -355,7 +374,8 @@ class Partition:
log(f"Could not get PARTUUID of partition using 'blkid -s PARTUUID -o value {self.device_path}': {error}")
- return self._partition_info.uuid
+ if self._partition_info:
+ return self._partition_info.uuid
@property
def encrypted(self) -> Union[bool, None]:
@@ -611,14 +631,7 @@ class Partition:
return False
def unmount(self) -> bool:
- worker = SysCommand(f"/usr/bin/umount {self._path}")
- exit_code = worker.exit_code
-
- # Without to much research, it seams that low error codes are errors.
- # And above 8k is indicators such as "/dev/x not mounted.".
- # So anything in between 0 and 8k are errors (?).
- if exit_code and 0 < exit_code < 8000:
- raise SysCallError(f"Could not unmount {self._path} properly: {worker}", exit_code=exit_code)
+ SysCommand(f"/usr/bin/umount {self._path}")
# Update the partition info since the mount info has changed after this call.
self._partition_info = self._fetch_information()
diff --git a/archinstall/lib/disk/validators.py b/archinstall/lib/disk/validators.py
index 54808886..076a8ba2 100644
--- a/archinstall/lib/disk/validators.py
+++ b/archinstall/lib/disk/validators.py
@@ -7,10 +7,12 @@ def valid_parted_position(pos :str) -> bool:
if pos.isdigit():
return True
- if pos.lower().endswith('b') and pos[:-1].isdigit():
+ pos_lower = pos.lower()
+
+ if (pos_lower.endswith('b') or pos_lower.endswith('s')) and pos[:-1].isdigit():
return True
- if any(pos.lower().endswith(size) and pos[:-len(size)].replace(".", "", 1).isdigit()
+ if any(pos_lower.endswith(size) and pos[:-len(size)].replace(".", "", 1).isdigit()
for size in ['%', 'kb', 'mb', 'gb', 'tb', 'kib', 'mib', 'gib', 'tib']):
return True
diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py
index 8c7aed91..79ab024b 100644
--- a/archinstall/lib/general.py
+++ b/archinstall/lib/general.py
@@ -130,7 +130,10 @@ class JsonEncoder:
copy[JsonEncoder._encode(key)] = val
return copy
elif hasattr(obj, 'json'):
- return obj.json()
+ # json() is a friendly name for json-helper, it should return
+ # a dictionary representation of the object so that it can be
+ # processed by the json library.
+ return json.loads(json.dumps(obj.json(), cls=JSON))
elif hasattr(obj, '__dump__'):
return obj.__dump__()
elif isinstance(obj, (datetime, date)):
@@ -185,12 +188,16 @@ class SysCommandWorker:
def __init__(self,
cmd :Union[str, List[str]],
callbacks :Optional[Dict[str, Any]] = None,
+ peek_output :Optional[bool] = False,
peak_output :Optional[bool] = False,
environment_vars :Optional[Dict[str, Any]] = None,
logfile :Optional[None] = None,
working_directory :Optional[str] = './',
remove_vt100_escape_codes_from_lines :bool = True):
+ if peak_output:
+ log("SysCommandWorker()'s peak_output is deprecated, use peek_output instead.", level=logging.WARNING, fg='red')
+
if not callbacks:
callbacks = {}
if not environment_vars:
@@ -208,7 +215,9 @@ class SysCommandWorker:
self.cmd = cmd
self.callbacks = callbacks
- self.peak_output = peak_output
+ self.peek_output = peek_output
+ if not self.peek_output and peak_output:
+ self.peek_output = peak_output
# define the standard locale for command outputs. For now the C ascii one. Can be overridden
self.environment_vars = {**storage.get('CMD_LOCALE',{}),**environment_vars}
self.logfile = logfile
@@ -262,7 +271,7 @@ class SysCommandWorker:
except:
pass
- if self.peak_output:
+ if self.peek_output:
# To make sure any peaked output didn't leave us hanging
# on the same line we were on.
sys.stdout.write("\n")
@@ -307,7 +316,7 @@ class SysCommandWorker:
self._trace_log_pos = min(max(0, pos), len(self._trace_log))
def peak(self, output: Union[str, bytes]) -> bool:
- if self.peak_output:
+ if self.peek_output:
if type(output) == bytes:
try:
output = output.decode('UTF-8')
@@ -320,8 +329,8 @@ class SysCommandWorker:
if peak_logfile.exists() is False:
change_perm = True
- with peak_logfile.open("a") as peak_output_log:
- peak_output_log.write(output)
+ with peak_logfile.open("a") as peek_output_log:
+ peek_output_log.write(output)
if change_perm:
os.chmod(str(peak_logfile), stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP)
@@ -349,10 +358,12 @@ class SysCommandWorker:
if self.ended or (got_output is False and pid_exists(self.pid) is False):
self.ended = time.time()
try:
- self.exit_code = os.waitpid(self.pid, 0)[1]
+ wait_status = os.waitpid(self.pid, 0)[1]
+ self.exit_code = os.waitstatus_to_exitcode(wait_status)
except ChildProcessError:
try:
- self.exit_code = os.waitpid(self.child_fd, 0)[1]
+ wait_status = os.waitpid(self.child_fd, 0)[1]
+ self.exit_code = os.waitstatus_to_exitcode(wait_status)
except ChildProcessError:
self.exit_code = 1
@@ -385,6 +396,13 @@ class SysCommandWorker:
os.chmod(str(history_logfile), stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP)
except PermissionError:
pass
+ # If history_logfile does not exist, ignore the error
+ except FileNotFoundError:
+ pass
+ except Exception as e:
+ exception_type = type(e).__name__
+ log(f"Unexpected {exception_type} occurred in {self.cmd}: {e}", level=logging.ERROR)
+ raise e
os.execve(self.cmd[0], list(self.cmd), {**os.environ, **self.environment_vars})
if storage['arguments'].get('debug'):
@@ -412,11 +430,15 @@ class SysCommand:
cmd :Union[str, List[str]],
callbacks :Optional[Dict[str, Callable[[Any], Any]]] = None,
start_callback :Optional[Callable[[Any], Any]] = None,
+ peek_output :Optional[bool] = False,
peak_output :Optional[bool] = False,
environment_vars :Optional[Dict[str, Any]] = None,
working_directory :Optional[str] = './',
remove_vt100_escape_codes_from_lines :bool = True):
+ if peak_output:
+ log("SysCommandWorker()'s peak_output is deprecated, use peek_output instead.", level=logging.WARNING, fg='red')
+
_callbacks = {}
if callbacks:
for hook, func in callbacks.items():
@@ -426,7 +448,9 @@ class SysCommand:
self.cmd = cmd
self._callbacks = _callbacks
- self.peak_output = peak_output
+ self.peek_output = peek_output
+ if not self.peek_output and peak_output:
+ self.peek_output = peak_output
self.environment_vars = environment_vars
self.working_directory = working_directory
self.remove_vt100_escape_codes_from_lines = remove_vt100_escape_codes_from_lines
@@ -469,7 +493,7 @@ class SysCommand:
return {
'cmd': self.cmd,
'callbacks': self._callbacks,
- 'peak': self.peak_output,
+ 'peak': self.peek_output,
'environment_vars': self.environment_vars,
'session': True if self.session else False
}
@@ -478,7 +502,7 @@ class SysCommand:
"""
Initiates a :ref:`SysCommandWorker` session in this class ``.session``.
It then proceeds to poll the process until it ends, after which it also
- clears any printed output if ``.peak_output=True``.
+ clears any printed output if ``.peek_output=True``.
"""
if self.session:
return self.session
@@ -486,7 +510,7 @@ class SysCommand:
with SysCommandWorker(
self.cmd,
callbacks=self._callbacks,
- peak_output=self.peak_output,
+ peek_output=self.peek_output,
environment_vars=self.environment_vars,
remove_vt100_escape_codes_from_lines=self.remove_vt100_escape_codes_from_lines,
working_directory=self.working_directory) as session:
@@ -497,7 +521,7 @@ class SysCommand:
while self.session.ended is None:
self.session.poll()
- if self.peak_output:
+ if self.peek_output:
sys.stdout.write('\n')
sys.stdout.flush()
diff --git a/archinstall/lib/hsm/fido.py b/archinstall/lib/hsm/fido.py
index 4cd956a3..1c226322 100644
--- a/archinstall/lib/hsm/fido.py
+++ b/archinstall/lib/hsm/fido.py
@@ -1,9 +1,11 @@
+from __future__ import annotations
+
import getpass
import logging
from dataclasses import dataclass
from pathlib import Path
-from typing import List
+from typing import List, Dict
from ..general import SysCommand, SysCommandWorker, clear_vt100_escape_codes
from ..disk.partition import Partition
@@ -16,6 +18,21 @@ class Fido2Device:
manufacturer: str
product: str
+ def json(self) -> Dict[str, str]:
+ return {
+ 'path': str(self.path),
+ 'manufacturer': self.manufacturer,
+ 'product': self.product
+ }
+
+ @classmethod
+ def parse_arg(cls, arg: Dict[str, str]) -> 'Fido2Device':
+ return Fido2Device(
+ Path(arg['path']),
+ arg['manufacturer'],
+ arg['product']
+ )
+
class Fido2:
_loaded: bool = False
@@ -76,7 +93,7 @@ class Fido2:
@classmethod
def fido2_enroll(cls, hsm_device: Fido2Device, partition :Partition, password :str):
- worker = SysCommandWorker(f"systemd-cryptenroll --fido2-device={hsm_device.path} {partition.real_device}", peak_output=True)
+ worker = SysCommandWorker(f"systemd-cryptenroll --fido2-device={hsm_device.path} {partition.real_device}", peek_output=True)
pw_inputted = False
pin_inputted = False
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index 1926f593..f1c7b3db 100644
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -132,6 +132,7 @@ class Installer:
# if HSM is not used to encrypt the root volume. Check mkinitcpio() function for that override.
self.HOOKS = ["base", "systemd", "autodetect", "keyboard", "sd-vconsole", "modconf", "block", "filesystems", "fsck"]
self.KERNEL_PARAMS = []
+ self.FSTAB_ENTRIES = []
self._zram_enabled = False
@@ -198,7 +199,7 @@ class Installer:
def _create_keyfile(self,luks_handle , partition :dict, password :str):
""" roiutine to create keyfiles, so it can be moved elsewhere
"""
- if self._disk_encryption.generate_encryption_file(partition):
+ if self._disk_encryption and self._disk_encryption.generate_encryption_file(partition):
if not (cryptkey_dir := pathlib.Path(f"{self.target}/etc/cryptsetup-keys.d")).exists():
cryptkey_dir.mkdir(parents=True)
# Once we store the key as ../xyzloop.key systemd-cryptsetup can automatically load this key
@@ -246,20 +247,21 @@ class Installer:
mount_queue = {}
# we manage the encrypted partititons
- for partition in self._disk_encryption.partitions:
- # open the luks device and all associate stuff
- loopdev = f"{storage.get('ENC_IDENTIFIER', 'ai')}{pathlib.Path(partition['device_instance'].path).name}"
-
- # note that we DON'T auto_unmount (i.e. close the encrypted device so it can be used
- with (luks_handle := luks2(partition['device_instance'], loopdev, self._disk_encryption.encryption_password, auto_unmount=False)) as unlocked_device:
- if self._disk_encryption.generate_encryption_file(partition) and not self._has_root(partition):
- list_luks_handles.append([luks_handle, partition, self._disk_encryption.encryption_password])
- # this way all the requesrs will be to the dm_crypt device and not to the physical partition
- partition['device_instance'] = unlocked_device
-
- if self._has_root(partition) and self._disk_encryption.generate_encryption_file(partition) is False:
- if self._disk_encryption.hsm_device:
- Fido2.fido2_enroll(self._disk_encryption.hsm_device, partition['device_instance'], self._disk_encryption.encryption_password)
+ if self._disk_encryption:
+ for partition in self._disk_encryption.all_partitions:
+ # open the luks device and all associate stuff
+ loopdev = f"{storage.get('ENC_IDENTIFIER', 'ai')}{pathlib.Path(partition['device_instance'].path).name}"
+
+ # note that we DON'T auto_unmount (i.e. close the encrypted device so it can be used
+ with (luks_handle := luks2(partition['device_instance'], loopdev, self._disk_encryption.encryption_password, auto_unmount=False)) as unlocked_device:
+ if self._disk_encryption.generate_encryption_file(partition) and not self._has_root(partition):
+ list_luks_handles.append([luks_handle, partition, self._disk_encryption.encryption_password])
+ # this way all the requesrs will be to the dm_crypt device and not to the physical partition
+ partition['device_instance'] = unlocked_device
+
+ if self._has_root(partition) and self._disk_encryption.generate_encryption_file(partition) is False:
+ if self._disk_encryption.hsm_device:
+ Fido2.fido2_enroll(self._disk_encryption.hsm_device, partition['device_instance'], self._disk_encryption.encryption_password)
btrfs_subvolumes = [entry for entry in list_part if entry.get('btrfs', {}).get('subvolumes', [])]
@@ -292,7 +294,7 @@ class Installer:
else:
mount_queue[mountpoint] = lambda instance=partition['device_instance'], target=f"{self.target}{mountpoint}": instance.mount(target)
- log(f"Using mount order: {list(sorted(mount_queue.items(), key=lambda item: item[0]))}", level=logging.INFO, fg="white")
+ log(f"Using mount order: {list(sorted(mount_queue.items(), key=lambda item: item[0]))}", level=logging.DEBUG, fg="white")
# We mount everything by sorting on the mountpoint itself.
for mountpoint, frozen_func in sorted(mount_queue.items(), key=lambda item: item[0]):
@@ -317,6 +319,26 @@ class Installer:
partition.mount(f'{self.target}{mountpoint}', options=options)
+ def add_swapfile(self, size='4G', enable_resume=True, file='/swapfile'):
+ if file[:1] != '/':
+ file = f"/{file}"
+ if len(file.strip()) <= 0 or file == '/':
+ raise ValueError(f"The filename for the swap file has to be a valid path, not: {self.target}{file}")
+
+ SysCommand(f'dd if=/dev/zero of={self.target}{file} bs={size} count=1')
+ SysCommand(f'chmod 0600 {self.target}{file}')
+ SysCommand(f'mkswap {self.target}{file}')
+
+ self.FSTAB_ENTRIES.append(f'{file} none swap defaults 0 0')
+
+ if enable_resume:
+ resume_uuid = SysCommand(f'findmnt -no UUID -T {self.target}{file}').decode('UTF-8').strip()
+ resume_offset = SysCommand(f'/usr/bin/filefrag -v {self.target}{file}').decode('UTF-8').split('0:', 1)[1].split(":", 1)[1].split("..", 1)[0].strip()
+
+ self.HOOKS.append('resume')
+ self.KERNEL_PARAMS.append(f'resume=UUID={resume_uuid}')
+ self.KERNEL_PARAMS.append(f'resume_offset={resume_offset}')
+
def post_install_check(self, *args :str, **kwargs :str) -> List[str]:
return [step for step, flag in self.helper_flags.items() if flag is False]
@@ -396,7 +418,8 @@ class Installer:
raise RequirementError(f'Could not sync mirrors: {error}', level=logging.ERROR, fg="red")
try:
- return SysCommand(f'/usr/bin/pacstrap -C /etc/pacman.conf {self.target} {" ".join(packages)} --noconfirm', peak_output=True).exit_code == 0
+ SysCommand(f'/usr/bin/pacstrap -C /etc/pacman.conf -K {self.target} {" ".join(packages)} --noconfirm', peek_output=True)
+ return True
except SysCallError as error:
self.log(f'Could not strap in packages: {error}', level=logging.ERROR, fg="red")
@@ -417,8 +440,10 @@ class Installer:
def genfstab(self, flags :str = '-pU') -> bool:
self.log(f"Updating {self.target}/etc/fstab", level=logging.INFO)
- if not (fstab := SysCommand(f'/usr/bin/genfstab {flags} {self.target}')).exit_code == 0:
- raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n Error: {fstab}')
+ try:
+ fstab = SysCommand(f'/usr/bin/genfstab {flags} {self.target}')
+ except SysCallError as error:
+ raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n Error: {error}')
with open(f"{self.target}/etc/fstab", 'a') as fstab_fh:
fstab_fh.write(fstab.decode())
@@ -431,6 +456,10 @@ class Installer:
if plugin.on_genfstab(self) is True:
break
+ with open(f"{self.target}/etc/fstab", 'a') as fstab_fh:
+ for entry in self.FSTAB_ENTRIES:
+ fstab_fh.write(f'{entry}\n')
+
return True
def set_hostname(self, hostname: str, *args :str, **kwargs :str) -> None:
@@ -463,7 +492,11 @@ class Installer:
with open(f'{self.target}/etc/locale.conf', 'w') as fh:
fh.write(f'LANG={locale}.{encoding}{modifier}\n')
- return True if SysCommand(f'/usr/bin/arch-chroot {self.target} locale-gen').exit_code == 0 else False
+ try:
+ SysCommand(f'/usr/bin/arch-chroot {self.target} locale-gen')
+ return True
+ except SysCallError:
+ return False
def set_timezone(self, zone :str, *args :str, **kwargs :str) -> bool:
if not zone:
@@ -519,8 +552,10 @@ class Installer:
def enable_service(self, *services :str) -> None:
for service in services:
self.log(f'Enabling service {service}', level=logging.INFO)
- if (output := self.arch_chroot(f'systemctl enable {service}')).exit_code != 0:
- raise ServiceException(f"Unable to start service {service}: {output}")
+ try:
+ self.arch_chroot(f'systemctl enable {service}')
+ except SysCallError as error:
+ raise ServiceException(f"Unable to start service {service}: {error}")
for plugin in plugins.values():
if hasattr(plugin, 'on_service'):
@@ -641,12 +676,17 @@ class Installer:
if plugin.on_mkinitcpio(self):
return True
+ # mkinitcpio will error out if there's no vconsole.
+ if (vconsole := pathlib.Path(f"{self.target}/etc/vconsole.conf")).exists() is False:
+ with vconsole.open('w') as fh:
+ fh.write(f"KEYMAP={storage['arguments']['keyboard-layout']}\n")
+
with open(f'{self.target}/etc/mkinitcpio.conf', 'w') as mkinit:
mkinit.write(f"MODULES=({' '.join(self.MODULES)})\n")
mkinit.write(f"BINARIES=({' '.join(self.BINARIES)})\n")
mkinit.write(f"FILES=({' '.join(self.FILES)})\n")
- if not self._disk_encryption.hsm_device:
+ if self._disk_encryption and not self._disk_encryption.hsm_device:
# For now, if we don't use HSM we revert to the old
# way of setting up encryption hooks for mkinitcpio.
# This is purely for stability reasons, we're going away from this.
@@ -656,7 +696,11 @@ class Installer:
mkinit.write(f"HOOKS=({' '.join(self.HOOKS)})\n")
- return SysCommand(f'/usr/bin/arch-chroot {self.target} mkinitcpio {" ".join(flags)}').exit_code == 0
+ try:
+ SysCommand(f'/usr/bin/arch-chroot {self.target} mkinitcpio {" ".join(flags)}')
+ return True
+ except SysCallError:
+ return False
def minimal_installation(
self, testing: bool = False, multilib: bool = False,
@@ -690,7 +734,7 @@ class Installer:
self.HOOKS.remove('fsck')
if self.detect_encryption(partition):
- if self._disk_encryption.hsm_device:
+ if self._disk_encryption and self._disk_encryption.hsm_device:
# Required bby mkinitcpio to add support for fido2-device options
self.pacstrap('libfido2')
@@ -754,14 +798,6 @@ class Installer:
# TODO: Use python functions for this
SysCommand(f'/usr/bin/arch-chroot {self.target} chmod 700 /root')
- if self._disk_encryption.hsm_device:
- # TODO:
- # A bit of a hack, but we need to get vconsole.conf in there
- # before running `mkinitcpio` because it expects it in HSM mode.
- if (vconsole := pathlib.Path(f"{self.target}/etc/vconsole.conf")).exists() is False:
- with vconsole.open('w') as fh:
- fh.write(f"KEYMAP={storage['arguments']['keyboard-layout']}\n")
-
self.mkinitcpio('-P')
self.helper_flags['base'] = True
@@ -841,60 +877,68 @@ class Installer:
os.makedirs(f'{self.target}/boot/loader/entries')
for kernel in self.kernels:
- # Setup the loader entry
- with open(f'{self.target}/boot/loader/entries/{self.init_time}_{kernel}.conf', 'w') as entry:
- entry.write('# Created by: archinstall\n')
- entry.write(f'# Created on: {self.init_time}\n')
- entry.write(f'title Arch Linux ({kernel})\n')
- entry.write(f"linux /vmlinuz-{kernel}\n")
- if not is_vm():
- vendor = cpu_vendor()
- if vendor == "AuthenticAMD":
- entry.write("initrd /amd-ucode.img\n")
- elif vendor == "GenuineIntel":
- entry.write("initrd /intel-ucode.img\n")
+ for variant in ("", "-fallback"):
+ # Setup the loader entry
+ with open(f'{self.target}/boot/loader/entries/{self.init_time}_{kernel}{variant}.conf', 'w') as entry:
+ entry.write('# Created by: archinstall\n')
+ entry.write(f'# Created on: {self.init_time}\n')
+ entry.write(f'title Arch Linux ({kernel}{variant})\n')
+ entry.write(f"linux /vmlinuz-{kernel}\n")
+ if not is_vm():
+ vendor = cpu_vendor()
+ if vendor == "AuthenticAMD":
+ entry.write("initrd /amd-ucode.img\n")
+ elif vendor == "GenuineIntel":
+ entry.write("initrd /intel-ucode.img\n")
+ else:
+ self.log(f"Unknown CPU vendor '{vendor}' detected. Archinstall won't add any ucode to systemd-boot config.", level=logging.DEBUG)
+ entry.write(f"initrd /initramfs-{kernel}{variant}.img\n")
+ # blkid doesn't trigger on loopback devices really well,
+ # so we'll use the old manual method until we get that sorted out.
+ root_fs_type = get_mount_fs_type(root_partition.filesystem)
+
+ if root_fs_type is not None:
+ options_entry = f'rw rootfstype={root_fs_type} {" ".join(self.KERNEL_PARAMS)}\n'
else:
- self.log(f"Unknown CPU vendor '{vendor}' detected. Archinstall won't add any ucode to systemd-boot config.", level=logging.DEBUG)
- entry.write(f"initrd /initramfs-{kernel}.img\n")
- # blkid doesn't trigger on loopback devices really well,
- # so we'll use the old manual method until we get that sorted out.
- root_fs_type = get_mount_fs_type(root_partition.filesystem)
-
- if root_fs_type is not None:
- options_entry = f'rw rootfstype={root_fs_type} {" ".join(self.KERNEL_PARAMS)}\n'
- else:
- options_entry = f'rw {" ".join(self.KERNEL_PARAMS)}\n'
+ options_entry = f'rw {" ".join(self.KERNEL_PARAMS)}\n'
- for subvolume in root_partition.subvolumes:
- if subvolume.root is True and subvolume.name != '<FS_TREE>':
- options_entry = f"rootflags=subvol={subvolume.name} " + options_entry
+ for subvolume in root_partition.subvolumes:
+ if subvolume.root is True and subvolume.name != '<FS_TREE>':
+ options_entry = f"rootflags=subvol={subvolume.name} " + options_entry
- # Zswap should be disabled when using zram.
- #
- # https://github.com/archlinux/archinstall/issues/881
- if self._zram_enabled:
- options_entry = "zswap.enabled=0 " + options_entry
+ # Zswap should be disabled when using zram.
+ #
+ # https://github.com/archlinux/archinstall/issues/881
+ if self._zram_enabled:
+ options_entry = "zswap.enabled=0 " + options_entry
- if real_device := self.detect_encryption(root_partition):
- # TODO: We need to detect if the encrypted device is a whole disk encryption,
- # or simply a partition encryption. Right now we assume it's a partition (and we always have)
- log(f"Identifying root partition by PART-UUID on {real_device}: '{real_device.uuid}/{real_device.part_uuid}'.", level=logging.DEBUG)
+ if real_device := self.detect_encryption(root_partition):
+ # TODO: We need to detect if the encrypted device is a whole disk encryption,
+ # or simply a partition encryption. Right now we assume it's a partition (and we always have)
+ log(f"Identifying root partition by PART-UUID on {real_device}: '{real_device.uuid}/{real_device.part_uuid}'.", level=logging.DEBUG)
- kernel_options = f"options"
+ kernel_options = f"options"
- if self._disk_encryption.hsm_device:
+ if self._disk_encryption.hsm_device:
+ # Note: lsblk UUID must be used, not PARTUUID for sd-encrypt to work
+ kernel_options += f" rd.luks.name={real_device.uuid}=luksdev"
+ # Note: tpm2-device and fido2-device don't play along very well:
+ # https://github.com/archlinux/archinstall/pull/1196#issuecomment-1129715645
+ kernel_options += f" rd.luks.options=fido2-device=auto,password-echo=no"
+ else:
+ kernel_options += f" cryptdevice=PARTUUID={real_device.part_uuid}:luksdev"
+
+ entry.write(f'{kernel_options} root=/dev/mapper/luksdev {options_entry}')
+
+ if self._disk_encryption and self._disk_encryption.hsm_device:
# Note: lsblk UUID must be used, not PARTUUID for sd-encrypt to work
kernel_options += f" rd.luks.name={real_device.uuid}=luksdev"
# Note: tpm2-device and fido2-device don't play along very well:
# https://github.com/archlinux/archinstall/pull/1196#issuecomment-1129715645
kernel_options += f" rd.luks.options=fido2-device=auto,password-echo=no"
else:
- kernel_options += f" cryptdevice=PARTUUID={real_device.part_uuid}:luksdev"
-
- entry.write(f'{kernel_options} root=/dev/mapper/luksdev {options_entry}')
- else:
- log(f"Identifying root partition by PARTUUID on {root_partition}, looking for '{root_partition.part_uuid}'.", level=logging.DEBUG)
- entry.write(f'options root=PARTUUID={root_partition.part_uuid} {options_entry}')
+ log(f"Identifying root partition by PARTUUID on {root_partition}, looking for '{root_partition.part_uuid}'.", level=logging.DEBUG)
+ entry.write(f'options root=PARTUUID={root_partition.part_uuid} {options_entry}')
self.helper_flags['bootloader'] = "systemd"
@@ -923,15 +967,15 @@ class Installer:
if has_uefi():
self.pacstrap('efibootmgr') # TODO: Do we need? Yes, but remove from minimal_installation() instead?
try:
- SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peak_output=True)
+ SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peek_output=True)
except SysCallError:
try:
- SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peak_output=True)
+ SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable', peek_output=True)
except SysCallError as error:
raise DiskError(f"Could not install GRUB to {self.target}/boot: {error}")
else:
try:
- SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=i386-pc --recheck {boot_partition.parent}', peak_output=True)
+ SysCommand(f'/usr/bin/arch-chroot {self.target} grub-install --debug --target=i386-pc --recheck {boot_partition.parent}', peek_output=True)
except SysCallError as error:
raise DiskError(f"Could not install GRUB to {boot_partition.path}: {error}")
@@ -1109,8 +1153,10 @@ class Installer:
if not handled_by_plugin:
self.log(f'Creating user {user}', level=logging.INFO)
- if not (output := SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}')).exit_code == 0:
- raise SystemError(f"Could not create user inside installation: {output}")
+ try:
+ SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}')
+ except SysCallError as error:
+ raise SystemError(f"Could not create user inside installation: {error}")
for plugin in plugins.values():
if hasattr(plugin, 'on_user_created'):
@@ -1138,17 +1184,28 @@ class Installer:
echo = shlex.join(['echo', combo])
sh = shlex.join(['sh', '-c', echo])
- result = SysCommand(f"/usr/bin/arch-chroot {self.target} " + sh[:-1] + " | chpasswd'")
- return result.exit_code == 0
+ try:
+ SysCommand(f"/usr/bin/arch-chroot {self.target} " + sh[:-1] + " | chpasswd'")
+ return True
+ except SysCallError:
+ return False
def user_set_shell(self, user :str, shell :str) -> bool:
self.log(f'Setting shell for {user} to {shell}', level=logging.INFO)
- return SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c \"chsh -s {shell} {user}\"").exit_code == 0
+ try:
+ SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c \"chsh -s {shell} {user}\"")
+ return True
+ except SysCallError:
+ return False
def chown(self, owner :str, path :str, options :List[str] = []) -> bool:
cleaned_path = path.replace('\'', '\\\'')
- return SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c 'chown {' '.join(options)} {owner} {cleaned_path}'").exit_code == 0
+ try:
+ SysCommand(f"/usr/bin/arch-chroot {self.target} sh -c 'chown {' '.join(options)} {owner} {cleaned_path}'")
+ return True
+ except SysCallError:
+ return False
def create_file(self, filename :str, owner :Optional[str] = None) -> InstallationFile:
return InstallationFile(self, filename, owner)
@@ -1166,8 +1223,10 @@ class Installer:
with Boot(self) as session:
os.system('/usr/bin/systemd-run --machine=archinstall --pty localectl set-keymap ""')
- if (output := session.SysCommand(["localectl", "set-keymap", language])).exit_code != 0:
- raise ServiceException(f"Unable to set locale '{language}' for console: {output}")
+ try:
+ session.SysCommand(["localectl", "set-keymap", language])
+ except SysCallError as error:
+ raise ServiceException(f"Unable to set locale '{language}' for console: {error}")
self.log(f"Keyboard language for this installation is now set to: {language}")
else:
@@ -1190,8 +1249,10 @@ class Installer:
with Boot(self) as session:
session.SysCommand(["localectl", "set-x11-keymap", '""'])
- if (output := session.SysCommand(["localectl", "set-x11-keymap", language])).exit_code != 0:
- raise ServiceException(f"Unable to set locale '{language}' for X11: {output}")
+ try:
+ session.SysCommand(["localectl", "set-x11-keymap", language])
+ except SysCallError as error:
+ raise ServiceException(f"Unable to set locale '{language}' for X11: {error}")
else:
self.log(f'X11-Keyboard language was not changed from default (no language specified).', fg="yellow", level=logging.INFO)
diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py
index 7e4534d8..ad6bf093 100644
--- a/archinstall/lib/luks.py
+++ b/archinstall/lib/luks.py
@@ -115,7 +115,7 @@ class luks2:
if cmd_handle.exit_code != 0:
raise DiskError(f'Could not encrypt volume "{partition.path}": {b"".join(cmd_handle)}')
except SysCallError as err:
- if err.exit_code == 256:
+ if err.exit_code == 1:
log(f'{partition} is being used, trying to unmount and crypt-close the device and running one more attempt at encrypting the device.', level=logging.DEBUG)
# Partition was in use, unmount it and try again
partition.unmount()
diff --git a/archinstall/lib/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py
index 5a7ca03a..d659d709 100644
--- a/archinstall/lib/menu/abstract_menu.py
+++ b/archinstall/lib/menu/abstract_menu.py
@@ -17,14 +17,14 @@ class Selector:
def __init__(
self,
description :str,
- func :Callable = None,
- display_func :Callable = None,
+ func :Optional[Callable] = None,
+ display_func :Optional[Callable] = None,
default :Any = None,
enabled :bool = False,
dependencies :List = [],
dependencies_not :List = [],
- exec_func :Callable = None,
- preview_func :Callable = None,
+ exec_func :Optional[Callable] = None,
+ preview_func :Optional[Callable] = None,
mandatory :bool = False,
no_store :bool = False
):
@@ -165,7 +165,7 @@ class Selector:
class AbstractMenu:
- def __init__(self, data_store: Dict[str, Any] = None, auto_cursor=False, preview_size :float = 0.2):
+ def __init__(self, data_store: Optional[Dict[str, Any]] = None, auto_cursor=False, preview_size :float = 0.2):
"""
Create a new selection menu.
@@ -226,7 +226,7 @@ class AbstractMenu:
""" will be called before each action in the menu """
return
- def post_callback(self, selection_name: str = None, value: Any = None):
+ def post_callback(self, selection_name: Optional[str] = None, value: Any = None):
""" will be called after each action in the menu """
return True
@@ -356,7 +356,7 @@ class AbstractMenu:
config_name, selector = self._find_selection(selection_name)
return self.exec_option(config_name, selector)
- def exec_option(self, config_name :str, p_selector :Selector = None) -> bool:
+ def exec_option(self, config_name :str, p_selector :Optional[Selector] = None) -> bool:
""" processes the execution of a given menu entry
- pre process callback
- selection function
@@ -372,13 +372,13 @@ class AbstractMenu:
self.pre_callback(config_name)
result = None
- if selector.func:
+ if selector.func is not None:
presel_val = self.option(config_name).get_selection()
result = selector.func(presel_val)
self._menu_options[config_name].set_current_selection(result)
if selector.do_store():
self._data_store[config_name] = result
- exec_ret_val = selector.exec_func(config_name,result) if selector.exec_func else False
+ exec_ret_val = selector.exec_func(config_name,result) if selector.exec_func is not None else False
self.post_callback(config_name,result)
if exec_ret_val and self._check_mandatory_status():
@@ -478,7 +478,7 @@ class AbstractMenu:
class AbstractSubMenu(AbstractMenu):
- def __init__(self, data_store: Dict[str, Any] = None):
+ def __init__(self, data_store: Optional[Dict[str, Any]] = None):
super().__init__(data_store=data_store)
self._menu_options['__separator__'] = Selector('')
diff --git a/archinstall/lib/menu/global_menu.py b/archinstall/lib/menu/global_menu.py
index 0d348227..7c5b153e 100644
--- a/archinstall/lib/menu/global_menu.py
+++ b/archinstall/lib/menu/global_menu.py
@@ -197,11 +197,11 @@ class GlobalMenu(AbstractMenu):
self._menu_options['abort'] = Selector(_('Abort'), exec_func=lambda n,v:exit(1))
- def _update_install_text(self, name :str = None, result :Any = None):
+ def _update_install_text(self, name :Optional[str] = None, result :Any = None):
text = self._install_text()
self._menu_options['install'].update_description(text)
- def post_callback(self,name :str = None ,result :Any = None):
+ def post_callback(self,name :Optional[str] = None ,result :Any = None):
self._update_install_text(name, result)
def _install_text(self):
@@ -279,8 +279,8 @@ class GlobalMenu(AbstractMenu):
output = str(_('Encryption type')) + f': {enc_type}\n'
output += str(_('Password')) + f': {secret(encryption.encryption_password)}\n'
- if encryption.partitions:
- output += 'Partitions: {} selected'.format(len(encryption.partitions)) + '\n'
+ if encryption.all_partitions:
+ output += 'Partitions: {} selected'.format(len(encryption.all_partitions)) + '\n'
if encryption.hsm_device:
output += f'HSM: {encryption.hsm_device.manufacturer}'
@@ -377,9 +377,9 @@ class GlobalMenu(AbstractMenu):
return harddrives
- def _select_profile(self, preset):
+ def _select_profile(self, preset) -> Optional[Profile]:
+ ret: Optional[Profile] = None
profile = select_profile(preset)
- ret = None
if profile is None:
if any([
@@ -403,7 +403,7 @@ class GlobalMenu(AbstractMenu):
namespace = f'{profile.namespace}.py'
with profile.load_instructions(namespace=namespace) as imported:
if imported._prep_function(servers=servers, desktop=desktop, desktop_env=desktop_env, gfx_driver=gfx_driver):
- ret: Profile = profile
+ ret = profile
match ret.name:
case 'minimal':
diff --git a/archinstall/lib/models/disk_encryption.py b/archinstall/lib/models/disk_encryption.py
index 3edab93e..a4a501d9 100644
--- a/archinstall/lib/models/disk_encryption.py
+++ b/archinstall/lib/models/disk_encryption.py
@@ -1,5 +1,7 @@
+from __future__ import annotations
+
from dataclasses import dataclass, field
-from enum import Enum, auto
+from enum import Enum
from typing import Optional, List, Dict, TYPE_CHECKING, Any
from ..hsm.fido import Fido2Device
@@ -9,8 +11,7 @@ if TYPE_CHECKING:
class EncryptionType(Enum):
- Partition = auto()
- # FullDiskEncryption = auto()
+ Partition = 'partition'
@classmethod
def _encryption_type_mapper(cls) -> Dict[str, 'EncryptionType']:
@@ -35,9 +36,55 @@ class EncryptionType(Enum):
class DiskEncryption:
encryption_type: EncryptionType = EncryptionType.Partition
encryption_password: str = ''
- partitions: List[str] = field(default_factory=list)
+ partitions: Dict[str, List[Dict[str, Any]]] = field(default_factory=dict)
hsm_device: Optional[Fido2Device] = None
+ @property
+ def all_partitions(self) -> List[Dict[str, Any]]:
+ _all: List[Dict[str, Any]] = []
+ for parts in self.partitions.values():
+ _all += parts
+ return _all
+
def generate_encryption_file(self, partition) -> bool:
- return partition in self.partitions and partition['mountpoint'] != '/'
-
+ return partition in self.all_partitions and partition['mountpoint'] != '/'
+
+ def json(self) -> Dict[str, Any]:
+ obj = {
+ 'encryption_type': self.encryption_type.value,
+ 'partitions': self.partitions
+ }
+
+ if self.hsm_device:
+ obj['hsm_device'] = self.hsm_device.json()
+
+ return obj
+
+ @classmethod
+ def parse_arg(
+ cls,
+ disk_layout: Dict[str, Any],
+ arg: Dict[str, Any],
+ password: str = ''
+ ) -> 'DiskEncryption':
+ # we have to map the enc partition config to the disk layout objects
+ # they both need to point to the same object as it will get modified
+ # during the installation process
+ enc_partitions: Dict[str, List[Dict[str, Any]]] = {}
+
+ for path, partitions in disk_layout.items():
+ conf_partitions = arg['partitions'].get(path, [])
+ for part in partitions['partitions']:
+ if part in conf_partitions:
+ enc_partitions.setdefault(path, []).append(part)
+
+ enc = DiskEncryption(
+ EncryptionType(arg['encryption_type']),
+ password,
+ enc_partitions
+ )
+
+ if hsm := arg.get('hsm_device', None):
+ enc.hsm_device = Fido2Device.parse_arg(hsm)
+
+ return enc
diff --git a/archinstall/lib/packages/packages.py b/archinstall/lib/packages/packages.py
index d5834f43..0743e83b 100644
--- a/archinstall/lib/packages/packages.py
+++ b/archinstall/lib/packages/packages.py
@@ -1,3 +1,4 @@
+import dataclasses
import json
import ssl
from typing import Dict, Any, Tuple, List
@@ -112,4 +113,4 @@ def installed_package(package :str) -> LocalPackage:
except SysCallError:
pass
- return LocalPackage(**package_info)
+ return LocalPackage({field.name: package_info.get(field.name) for field in dataclasses.fields(LocalPackage)})
diff --git a/archinstall/lib/systemd.py b/archinstall/lib/systemd.py
index f459f94b..64ffcae4 100644
--- a/archinstall/lib/systemd.py
+++ b/archinstall/lib/systemd.py
@@ -97,8 +97,6 @@ class Boot:
shutdown = SysCommand(f'systemd-run --machine={self.container_name} --pty shutdown now')
except SysCallError as error:
shutdown_exit_code = error.exit_code
- # if error.exit_code == 256:
- # pass
while self.session.is_alive():
time.sleep(0.25)
diff --git a/archinstall/lib/user_interaction/general_conf.py b/archinstall/lib/user_interaction/general_conf.py
index 76631a98..fc7ded45 100644
--- a/archinstall/lib/user_interaction/general_conf.py
+++ b/archinstall/lib/user_interaction/general_conf.py
@@ -174,7 +174,10 @@ def select_profile(preset) -> Optional[Profile]:
storage['profile_minimal'] = False
storage['_selected_servers'] = []
storage['_desktop_profile'] = None
+ storage['sway_sys_priv_ctrl'] = None
+ storage['arguments']['sway_sys_priv_ctrl'] = None
storage['arguments']['desktop-environment'] = None
+ storage['arguments']['gfx_driver'] = None
storage['arguments']['gfx_driver_packages'] = None
return None
case MenuSelectionType.Skip:
diff --git a/archinstall/lib/user_interaction/partitioning_conf.py b/archinstall/lib/user_interaction/partitioning_conf.py
index cff76dc2..0a5ede51 100644
--- a/archinstall/lib/user_interaction/partitioning_conf.py
+++ b/archinstall/lib/user_interaction/partitioning_conf.py
@@ -208,7 +208,7 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str,
if fs_choice.type_ == MenuSelectionType.Skip:
continue
- prompt = str(_('Enter the start sector (percentage or block number, default: {}): ')).format(
+ prompt = str(_('Enter the start location (in parted units: s, GB, %, etc. ; default: {}): ')).format(
block_device.first_free_sector
)
start = input(prompt).strip()
@@ -219,7 +219,7 @@ def manage_new_and_existing_partitions(block_device: 'BlockDevice') -> Dict[str,
else:
end_suggested = '100%'
- prompt = str(_('Enter the end sector of the partition (percentage or block number, ex: {}): ')).format(
+ prompt = str(_('Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): ')).format(
end_suggested
)
end = input(prompt).strip()
diff --git a/archinstall/lib/user_interaction/save_conf.py b/archinstall/lib/user_interaction/save_conf.py
index d60ef995..5b4ae2b3 100644
--- a/archinstall/lib/user_interaction/save_conf.py
+++ b/archinstall/lib/user_interaction/save_conf.py
@@ -1,9 +1,12 @@
from __future__ import annotations
+import logging
+
from pathlib import Path
from typing import Any, Dict, TYPE_CHECKING
from ..configuration import ConfigurationOutput
+from ..general import SysCommand
from ..menu import Menu
from ..menu.menu import MenuSelectionType
from ..output import log
@@ -58,20 +61,75 @@ def save_config(config: Dict):
if choice.type_ == MenuSelectionType.Skip:
return
- while True:
- path = input(_('Enter a directory for the configuration(s) to be saved: ')).strip(' ')
- dest_path = Path(path)
- if dest_path.exists() and dest_path.is_dir():
- break
- log(_('Not a valid directory: {}').format(dest_path), fg='red')
-
- if options['user_config'] == choice.value:
- config_output.save_user_config(dest_path)
- elif options['user_creds'] == choice.value:
- config_output.save_user_creds(dest_path)
- elif options['disk_layout'] == choice.value:
- config_output.save_disk_layout(dest_path)
- elif options['all'] == choice.value:
- config_output.save_user_config(dest_path)
- config_output.save_user_creds(dest_path)
- config_output.save_disk_layout(dest_path)
+ dirs_to_exclude = [
+ '/bin',
+ '/dev',
+ '/lib',
+ '/lib64',
+ '/lost+found',
+ '/opt',
+ '/proc',
+ '/run',
+ '/sbin',
+ '/srv',
+ '/sys',
+ '/usr',
+ '/var',
+ ]
+ log(
+ _('When picking a directory to save configuration files to,'
+ ' by default we will ignore the following folders: ') + ','.join(dirs_to_exclude),
+ level=logging.DEBUG
+ )
+
+ log(_('Finding possible directories to save configuration files ...'), level=logging.INFO)
+
+ find_exclude = '-path ' + ' -prune -o -path '.join(dirs_to_exclude) + ' -prune '
+ file_picker_command = f'find / {find_exclude} -o -type d -print0'
+ possible_save_dirs = list(
+ filter(None, SysCommand(file_picker_command).decode().split('\x00'))
+ )
+
+ selection = Menu(
+ _('Select directory (or directories) for saving configuration files'),
+ possible_save_dirs,
+ multi=True,
+ skip=True,
+ allow_reset=False,
+ ).run()
+
+ match selection.type_:
+ case MenuSelectionType.Skip:
+ return
+ case _:
+ save_dirs = selection.value
+
+ prompt = _('Do you want to save {} configuration file(s) in the following locations?\n\n{}').format(
+ list(options.keys())[list(options.values()).index(choice.value)],
+ save_dirs
+ )
+ save_confirmation = Menu(prompt, Menu.yes_no(), default_option=Menu.yes()).run()
+ if save_confirmation == Menu.no():
+ return
+
+ log(
+ _('Saving {} configuration files to {}').format(
+ list(options.keys())[list(options.values()).index(choice.value)],
+ save_dirs
+ ),
+ level=logging.DEBUG
+ )
+
+ if save_dirs is not None:
+ for save_dir_str in save_dirs:
+ save_dir = Path(save_dir_str)
+ if options['user_config'] == choice.value:
+ config_output.save_user_config(save_dir)
+ elif options['user_creds'] == choice.value:
+ config_output.save_user_creds(save_dir)
+ elif options['disk_layout'] == choice.value:
+ config_output.save_disk_layout(save_dir)
+ elif options['all'] == choice.value:
+ config_output.save_user_config(save_dir)
+ config_output.save_user_creds(save_dir)
+ config_output.save_disk_layout(save_dir)
diff --git a/archinstall/lib/user_interaction/system_conf.py b/archinstall/lib/user_interaction/system_conf.py
index 8454a3da..68a1a7d2 100644
--- a/archinstall/lib/user_interaction/system_conf.py
+++ b/archinstall/lib/user_interaction/system_conf.py
@@ -60,7 +60,6 @@ def select_harddrives(preset: List[str] = []) -> List[str]:
selected_harddrive = Menu(
title,
list(options.keys()),
- preset_values=preset,
multi=True,
allow_reset=True,
allow_reset_warning_msg=warning
diff --git a/archinstall/locales/ar/LC_MESSAGES/base.po b/archinstall/locales/ar/LC_MESSAGES/base.po
index 1a9fc1aa..c9540b38 100644
--- a/archinstall/locales/ar/LC_MESSAGES/base.po
+++ b/archinstall/locales/ar/LC_MESSAGES/base.po
@@ -97,10 +97,10 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr ""
-msgid "Enter the start sector (percentage or block number, default: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
@@ -782,3 +782,45 @@ msgstr ""
msgid "TAB to select"
msgstr ""
+
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+msgid "Encryption type"
+msgstr ""
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+msgid "Partitions to be encrypted"
+msgstr ""
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+msgid "All settings will be reset, are you sure?"
+msgstr ""
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Partition encryption"
+msgstr ""
diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot
index 2becbbf3..651fbd58 100644
--- a/archinstall/locales/base.pot
+++ b/archinstall/locales/base.pot
@@ -97,11 +97,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr ""
-msgid "Enter the start sector (percentage or block number, default: {}): "
+msgid ""
+"Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
msgstr ""
-msgid ""
-"Enter the end sector of the partition (percentage or block number, ex: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
@@ -843,3 +843,36 @@ msgstr ""
msgid "The font should be stored as {}"
msgstr ""
+
+msgid "Encryption type"
+msgstr ""
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+msgid "Partitions to be encrypted"
+msgstr ""
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+msgid "All settings will be reset, are you sure?"
+msgstr ""
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Partition encryption"
+msgstr ""
diff --git a/archinstall/locales/cs/LC_MESSAGES/base.mo b/archinstall/locales/cs/LC_MESSAGES/base.mo
index b175a54e..a256081c 100644
--- a/archinstall/locales/cs/LC_MESSAGES/base.mo
+++ b/archinstall/locales/cs/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/cs/LC_MESSAGES/base.po b/archinstall/locales/cs/LC_MESSAGES/base.po
index b3dea244..a09c6001 100644
--- a/archinstall/locales/cs/LC_MESSAGES/base.po
+++ b/archinstall/locales/cs/LC_MESSAGES/base.po
@@ -94,11 +94,11 @@ msgstr "Zvolte co dělat s {}"
msgid "Enter a desired filesystem type for the partition"
msgstr "Zadejte požadovaný souborový systém pro oddíl"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Zadejte počáteční sektor (procenta nebo číslo bloku, výchozí: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Zadejte koncový sektor oddílu (procenta nebo číslo bloku, např. {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} obsahuje oddíly ve frontě, toto je odstraní, jste si jisti?"
@@ -821,3 +821,55 @@ msgstr ""
msgid "TAB to select"
msgstr ""
+
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Šifrovací heslo"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Zvolte oddíl, který bude označen jako šifrovaný"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} obsahuje oddíly ve frontě, toto je odstraní, jste si jisti?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Heslo správce (root)"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Zadejte počáteční sektor (procenta nebo číslo bloku, výchozí: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Zadejte koncový sektor oddílu (procenta nebo číslo bloku, např. {}): "
diff --git a/archinstall/locales/de/LC_MESSAGES/base.mo b/archinstall/locales/de/LC_MESSAGES/base.mo
index ca3f2971..0572f28b 100644
--- a/archinstall/locales/de/LC_MESSAGES/base.mo
+++ b/archinstall/locales/de/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/de/LC_MESSAGES/base.po b/archinstall/locales/de/LC_MESSAGES/base.po
index dee2b481..ac677188 100644
--- a/archinstall/locales/de/LC_MESSAGES/base.po
+++ b/archinstall/locales/de/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Bitte wählen Sie einen Dateisystemtyp für die Partition aus"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Bitte geben Sie den start Sektor ein (in Prozent oder Blocknummer, default: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr "Bitte geben Sie die Startposition ein (in parted Einheiten: s, GB, %, etc. ; default: {}): "
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Bitte geben Sie den end Sektor ein (in Prozent oder Blocknummer, default: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr "Bitte geben Sie die Endposition ein (in parted Einheiten: s, GB, %, etc. ; default: {}): "
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} enthält Partitionen in der Warteschlange, dies werden damit entfernt, sind sie sicher?"
@@ -841,8 +841,52 @@ msgstr ""
msgid "TAB to select"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "Laufwerke-layout auswählen"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Verschlüsselungspasswort angeben"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Bitte wählen sie welche Partition verschlüsselt werden soll"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Laufwerke-layout auswählen"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} enthält Partitionen in der Warteschlange, dies werden damit entfernt, sind sie sicher?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Root Passwort"
+
+msgid "Partition encryption"
+msgstr ""
#~ msgid "Add :"
#~ msgstr "Hinzufügen :"
diff --git a/archinstall/locales/el/LC_MESSAGES/base.mo b/archinstall/locales/el/LC_MESSAGES/base.mo
index beae2659..103eaf0c 100644
--- a/archinstall/locales/el/LC_MESSAGES/base.mo
+++ b/archinstall/locales/el/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/el/LC_MESSAGES/base.po b/archinstall/locales/el/LC_MESSAGES/base.po
index c41dbb7e..efcd6b49 100644
--- a/archinstall/locales/el/LC_MESSAGES/base.po
+++ b/archinstall/locales/el/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Εισάγετε ένα επιθυμητό τύπο συστήματος αρχείων για τη διαμέριση"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Εισάγετε τον start sector (ποσοστό ή αριθμό block, προκαθορισμένο {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Εισάγετε τον end sector της διαμέρισης (ποσοστό ή αριθμό block, πχ: {}) "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} περιέχει διαμερίσεις στην ουρά, αυτό θα τις διαγράψει, είστε σίγουρη/ος;"
@@ -828,3 +828,55 @@ msgstr ""
msgid "TAB to select"
msgstr ""
+
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Κωδικός κρυπτογράφησης"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Επιλέξτε ποιες διαμερίσεις να κρυπτογραφηθούν."
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} περιέχει διαμερίσεις στην ουρά, αυτό θα τις διαγράψει, είστε σίγουρη/ος;"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Κωδικός root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Εισάγετε τον start sector (ποσοστό ή αριθμό block, προκαθορισμένο {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Εισάγετε τον end sector της διαμέρισης (ποσοστό ή αριθμό block, πχ: {}) "
diff --git a/archinstall/locales/en/LC_MESSAGES/base.po b/archinstall/locales/en/LC_MESSAGES/base.po
index 62543eaa..f1722ef9 100644
--- a/archinstall/locales/en/LC_MESSAGES/base.po
+++ b/archinstall/locales/en/LC_MESSAGES/base.po
@@ -94,10 +94,10 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr ""
-msgid "Enter the start sector (percentage or block number, default: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
@@ -778,3 +778,45 @@ msgstr ""
msgid "TAB to select"
msgstr ""
+
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+msgid "Encryption type"
+msgstr ""
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+msgid "Partitions to be encrypted"
+msgstr ""
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+msgid "All settings will be reset, are you sure?"
+msgstr ""
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Partition encryption"
+msgstr ""
diff --git a/archinstall/locales/es/LC_MESSAGES/base.mo b/archinstall/locales/es/LC_MESSAGES/base.mo
index 6006c274..7194020e 100644
--- a/archinstall/locales/es/LC_MESSAGES/base.mo
+++ b/archinstall/locales/es/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/es/LC_MESSAGES/base.po b/archinstall/locales/es/LC_MESSAGES/base.po
index f744daae..20101de0 100644
--- a/archinstall/locales/es/LC_MESSAGES/base.po
+++ b/archinstall/locales/es/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Ingrese un tipo de sistema de archivos deseado para la partición"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Introduzca el sector de inicio (porcentaje o número de bloque, predeterminado: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Ingrese el sector final de la partición (porcentaje o número de bloque, ej: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} contiene particiones en cola, esto eliminará esas particiones, ¿estás seguro?"
@@ -827,8 +827,58 @@ msgstr ""
msgid "TAB to select"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "Seleccione el diseño del disco"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Contraseña de cifrado"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Seleccione qué particiones cifrar"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Seleccione el diseño del disco"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} contiene particiones en cola, esto eliminará esas particiones, ¿estás seguro?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Contraseña de root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Introduzca el sector de inicio (porcentaje o número de bloque, predeterminado: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Ingrese el sector final de la partición (porcentaje o número de bloque, ej: {}): "
#~ msgid "Add :"
#~ msgstr "Añadir :"
diff --git a/archinstall/locales/fr/LC_MESSAGES/base.mo b/archinstall/locales/fr/LC_MESSAGES/base.mo
index b8f19aa7..16b8a6cf 100644
--- a/archinstall/locales/fr/LC_MESSAGES/base.mo
+++ b/archinstall/locales/fr/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/fr/LC_MESSAGES/base.po b/archinstall/locales/fr/LC_MESSAGES/base.po
index f5946503..76080e40 100644
--- a/archinstall/locales/fr/LC_MESSAGES/base.po
+++ b/archinstall/locales/fr/LC_MESSAGES/base.po
@@ -3,13 +3,13 @@ msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
-"Last-Translator: roxfr <roxfr@outlook.fr>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.0.1\n"
+"X-Generator: Poedit 3.2.2\n"
msgid "[!] A log file has been created here: {} {}"
msgstr "[!] Un fichier journal a été créé ici : {} {}"
@@ -69,7 +69,7 @@ msgid "Select one network interface to configure"
msgstr "Sélectionner une interface réseau à configurer"
msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\""
-msgstr "Sélectionner le mode à configurer pour \"{}\" ou ignorer pour utiliser le mode par défaut \"{}\""
+msgstr ""
msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): "
msgstr "Entrer l'IP et le sous-réseau pour {} (exemple : 192.168.0.5/24) : "
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Entrer un type de système de fichiers souhaité pour la partition"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Entrer le secteur de début (pourcentage ou numéro de bloc, par défaut : {}) : "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Entrer le secteur de fin de la partition (pourcentage ou numéro de bloc, ex : {}) : "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?"
@@ -214,7 +214,7 @@ msgid "All open-source (default)"
msgstr "Tout open-source (par défaut)"
msgid "Choose which kernels to use or leave blank for default \"{}\""
-msgstr "Choisir les noyaux à utiliser ou laissez vide par défaut \"{}\""
+msgstr ""
msgid "Choose which locale language to use"
msgstr "Choisir la langue locale à utiliser"
@@ -659,7 +659,6 @@ msgstr "Une installation très basique qui vous permet de personnaliser Arch Lin
msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb"
msgstr "Fournit une sélection de divers paquets de serveur à installer et à activer, par ex. httpd, nginx, mariadb"
-#, fuzzy
msgid "Choose which servers to install, if none then a minimal installation will be done"
msgstr "Choisir les serveurs à installer, s'il n'y en a pas, une installation minimale sera effectuée"
@@ -756,7 +755,7 @@ msgid "Either root-password or at least 1 user with sudo privileges must be spec
msgstr "Le mot de passe root ou au moins 1 utilisateur avec des privilèges sudo doit être spécifié"
msgid "Enter username (leave blank to skip): "
-msgstr "Entrer le nom d'utilisateur (laisser vide pour passer) :"
+msgstr "Entrer le nom d'utilisateur (laisser vide pour passer) : "
msgid "The username you entered is invalid. Try again"
msgstr "Le nom d'utilisateur que vous avez saisi n'est pas valide. Réessayer"
@@ -764,38 +763,35 @@ msgstr "Le nom d'utilisateur que vous avez saisi n'est pas valide. Réessayer"
msgid "Should \"{}\" be a superuser (sudo)?"
msgstr "\"{}\" devrait-il être un superutilisateur (sudo) ?"
-#, fuzzy
msgid "Select which partitions to encrypt"
-msgstr "Sélectionner la partition à marquer comme chiffrée"
+msgstr "Sélectionner les partitions à chiffrer"
msgid "very weak"
-msgstr ""
+msgstr "très faible"
msgid "weak"
-msgstr ""
+msgstr "faible"
msgid "moderate"
-msgstr ""
+msgstr "modéré"
msgid "strong"
-msgstr ""
+msgstr "fort"
-#, fuzzy
msgid "Add subvolume"
-msgstr " Sous-volume : {:16}"
+msgstr "Ajouter un sous-volume"
msgid "Edit subvolume"
-msgstr ""
+msgstr "Modifier le sous-volume"
-#, fuzzy
msgid "Delete subvolume"
-msgstr "Supprimer l'utilisateur"
+msgstr "Supprimer le sous-volume"
msgid "Configured {} interfaces"
-msgstr ""
+msgstr "Interfaces {} configurées"
msgid "This option enables the number of parallel downloads that can occur during installation"
-msgstr ""
+msgstr "Cette option active le nombre de téléchargements parallèles qui peuvent se produire pendant l'installation"
#, python-brace-format
msgid ""
@@ -803,35 +799,87 @@ msgid ""
" (Enter a value between 1 to {max_downloads})\n"
"Note:"
msgstr ""
+"Saisir le nombre de téléchargements parallèles à activer.\n"
+" (Entrer une valeur comprise entre 1 et {max_downloads})\n"
+"Note :"
msgid " - Maximum value : {max_downloads} ( Allows {max_downloads} parallel downloads, allows {max_downloads+1} downloads at a time )"
-msgstr ""
+msgstr " - Valeur maximale : {max_downloads} (Autorise {max_downloads} téléchargements parallèles, autorise {max_downloads+1} téléchargements à la fois)"
msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )"
-msgstr ""
+msgstr " - Valeur minimale : 1 (Autorise 1 téléchargement parallèle, autorise 2 téléchargements à la fois)"
msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )"
-msgstr ""
+msgstr " - Désactiver/Défaut : 0 (Désactive le téléchargement parallèle, n'autorise qu'un seul téléchargement à la fois)"
#, python-brace-format
msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]"
-msgstr ""
+msgstr "Entrée invalide ! Réessayer avec une entrée valide [1 pour {max_downloads}, ou 0 pour désactiver]"
msgid "Parallel Downloads"
-msgstr ""
+msgstr "Téléchargements parallèles"
-#, fuzzy
msgid "ESC to skip"
-msgstr "Utiliser ESC pour ignorer"
+msgstr "ESC pour ignorer"
msgid "CTRL+C to reset"
-msgstr ""
+msgstr "CTRL+C pour réinitialiser"
msgid "TAB to select"
+msgstr "TAB pour sélectionner"
+
+msgid "[Default value: 0] > "
+msgstr "[Valeur par défaut : 0] > "
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr "Pour pouvoir utiliser cette traduction, veuillez installer manuellement une police prenant en charge la langue."
+
+msgid "The font should be stored as {}"
+msgstr "La police doit être stockée sous {}"
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Mot de passe de chiffrement"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Sélectionner les partitions à chiffrer"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Sélectionner la disposition du disque"
+
+msgid "Select a FIDO2 device to use for HSM"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "Sélectionner la disposition du disque"
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} contient des partitions en file d'attente, cela les supprimera, êtes-vous sûr ?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Mot de passe root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Entrer le secteur de début (pourcentage ou numéro de bloc, par défaut : {}) : "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Entrer le secteur de fin de la partition (pourcentage ou numéro de bloc, ex : {}) : "
#, python-brace-format
#~ msgid "Edit {origkey} :"
diff --git a/archinstall/locales/id/LC_MESSAGES/base.mo b/archinstall/locales/id/LC_MESSAGES/base.mo
index c02df9eb..6e707237 100644
--- a/archinstall/locales/id/LC_MESSAGES/base.mo
+++ b/archinstall/locales/id/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/id/LC_MESSAGES/base.po b/archinstall/locales/id/LC_MESSAGES/base.po
index 85479389..6cc19cbf 100644
--- a/archinstall/locales/id/LC_MESSAGES/base.po
+++ b/archinstall/locales/id/LC_MESSAGES/base.po
@@ -9,7 +9,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 3.1\n"
+"X-Generator: Poedit 3.2.2\n"
msgid "[!] A log file has been created here: {} {}"
msgstr "[!] File log telah dibuat di sini: {} {}"
@@ -96,14 +96,14 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Masukkan jenis filesystem yang diinginkan untuk partisi"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Masukkan sektor awal (persentase atau nomor blok, default: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr "Masukkan lokasi awal (dalam satuan parted: s, GB, %, dll. ; default: {}): "
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Masukkan sektor akhir partisi (persentase atau nomor blok, mis: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr "Masukkan lokasi akhir (dalam satuan parted: s, GB, %, dll. ; cth: {}): "
msgid "{} contains queued partitions, this will remove those, are you sure?"
-msgstr "{} berisi partisi yang mengantri, ini akan menghapusnya, apakah Anda yakin?"
+msgstr "{} berisi partisi yang telah di-queue, tindakan ini akan menghapusnya, apakah Anda yakin?"
msgid ""
"{}\n"
@@ -561,7 +561,7 @@ msgstr ""
"Isi nilai yang diinginkan untuk subvolume baru\n"
msgid "Subvolume name "
-msgstr " Nama subvolume"
+msgstr "Nama subvolume "
msgid "Subvolume mountpoint"
msgstr "Titik mount subvolume"
@@ -755,7 +755,7 @@ msgid "Either root-password or at least 1 user with sudo privileges must be spec
msgstr "Baik kata sandi root atau setidaknya 1 pengguna dengan hak sudo harus ditentukan"
msgid "Enter username (leave blank to skip): "
-msgstr " Masukkan nama pengguna (kosongkan untuk melewati):"
+msgstr "Masukkan nama pengguna (kosongkan untuk melewati): "
msgid "The username you entered is invalid. Try again"
msgstr "Nama pengguna yang Anda masukkan tidak valid. Coba lagi"
@@ -830,3 +830,48 @@ msgstr "TAB untuk memilih"
msgid "[Default value: 0] > "
msgstr "[Nilai default: 0] > "
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr "Untuk dapat menggunakan terjemahan ini, silakan instal font yang mendukung bahasa tersebut secara manual."
+
+msgid "The font should be stored as {}"
+msgstr "Font harus disimpan sebagai {}"
+
+msgid "Encryption type"
+msgstr "Tipe enkripsi"
+
+msgid "Partitions"
+msgstr "Partisi"
+
+msgid "No HSM devices available"
+msgstr "Tidak ada perangkat HSM yang tersedia"
+
+msgid "Partitions to be encrypted"
+msgstr "Partisi yang akan dienkripsi"
+
+msgid "Select disk encryption option"
+msgstr "Pilih opsi enkripsi disk"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr "Pilih perangkat FID02 yang akan digunakan untuk HSM"
+
+msgid "All settings will be reset, are you sure?"
+msgstr "Semua pengaturan akan direset, apakah Anda yakin?"
+
+msgid "Back"
+msgstr "Kembali"
+
+msgid "Disk encryption"
+msgstr "Enkripsi disk"
+
+msgid "Password"
+msgstr "Kata sandi"
+
+msgid "Partition encryption"
+msgstr "Enkripsi partisi"
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Masukkan sektor awal (persentase atau nomor blok, default: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Masukkan sektor akhir partisi (persentase atau nomor blok, mis: {}): "
diff --git a/archinstall/locales/it/LC_MESSAGES/base.mo b/archinstall/locales/it/LC_MESSAGES/base.mo
index e1dccd81..f199746c 100644
--- a/archinstall/locales/it/LC_MESSAGES/base.mo
+++ b/archinstall/locales/it/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/it/LC_MESSAGES/base.po b/archinstall/locales/it/LC_MESSAGES/base.po
index 176d3959..00df1a3f 100644
--- a/archinstall/locales/it/LC_MESSAGES/base.po
+++ b/archinstall/locales/it/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Immettere un tipo di filesystem desiderato per la partizione"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Inserisci il settore iniziale (percentuale o numero di blocco, predefinito: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Inserisci il settore finale (percentuale o numero di blocco, predefinito: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} contiene partizioni in coda, questo le rimuoverà, sei sicuro?"
@@ -836,3 +836,46 @@ msgstr "Per poter utilizzare questa traduzione, installa manualmente un font che
msgid "The font should be stored as {}"
msgstr "Il carattere dovrebbe essere memorizzato come {}"
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Password di crittografia"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Seleziona le partizioni da crittografare"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} contiene partizioni in coda, questo le rimuoverà, sei sicuro?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Password di root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Inserisci il settore iniziale (percentuale o numero di blocco, predefinito: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Inserisci il settore finale (percentuale o numero di blocco, predefinito: {}): "
diff --git a/archinstall/locales/ka/LC_MESSAGES/base.mo b/archinstall/locales/ka/LC_MESSAGES/base.mo
new file mode 100644
index 00000000..b95a6e0e
--- /dev/null
+++ b/archinstall/locales/ka/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/ka/LC_MESSAGES/base.po b/archinstall/locales/ka/LC_MESSAGES/base.po
new file mode 100644
index 00000000..c89ec795
--- /dev/null
+++ b/archinstall/locales/ka/LC_MESSAGES/base.po
@@ -0,0 +1,878 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: archinstall\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <(nothing)>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+msgid "[!] A log file has been created here: {} {}"
+msgstr "[!] ჟურნალის ფაილი შეიქმნა აქ: {} {}"
+
+msgid " Please submit this issue (and file) to https://github.com/archlinux/archinstall/issues"
+msgstr " ეს პრობლემა და ფაილი გადმოგვიგზავნეთ ბმულზე https://github.com/archlinux/archinstall/issues"
+
+msgid "Do you really want to abort?"
+msgstr "გნებავთ, გააუქმოთ?"
+
+msgid "And one more time for verification: "
+msgstr "და კიდევ ერთხელ, გადასამოწმებლად: "
+
+msgid "Would you like to use swap on zram?"
+msgstr "გნებავთ სვოპის ZRAM-ზე გამოყენება?"
+
+msgid "Desired hostname for the installation: "
+msgstr "ჰოსტის სასურველი სახელი, დაყენებისთვის: "
+
+msgid "Username for required superuser with sudo privileges: "
+msgstr "Sudo პრივილეგიების მქონე ზემომხმარებლის მომხმარებლის სახელი: "
+
+msgid "Any additional users to install (leave blank for no users): "
+msgstr "დამატებითი მომხმარებლები დასაყენებლად (მომხმარებლების გარეშე გასაგრძელებლად ცარიელი დატოვეთ): "
+
+msgid "Should this user be a superuser (sudoer)?"
+msgstr "უნდა იყოს ეს მომხმარებელი ზემომხმარებელი (sudoer)?"
+
+msgid "Select a timezone"
+msgstr "აირჩიეთ დროის სარტყელი"
+
+msgid "Would you like to use GRUB as a bootloader instead of systemd-boot?"
+msgstr "გნებავთ ჩამტვირთავად system-boot-ის მაგიერ GRUB-ი გამოიყენოთ?"
+
+msgid "Choose a bootloader"
+msgstr "აირჩიეთ ჩამტვირთავი"
+
+msgid "Choose an audio server"
+msgstr "აირჩიეთ აუდიოსერვერი"
+
+msgid "Only packages such as base, base-devel, linux, linux-firmware, efibootmgr and optional profile packages are installed."
+msgstr "მოხდება მხოლოდ ისეთი პაკეტების დაყენება, როგორებიცაა base, base-devel, linux, linux-firmware, efibootmgr და არასავალდებულო პროფილის პაკეტი."
+
+msgid "If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt."
+msgstr "თუ გნებავთ ბრაუზერის, როგორებიცაა firefox ან chromium, ქონა, შემდეგი რამ უნდა მიუთითოთ."
+
+msgid "Write additional packages to install (space separated, leave blank to skip): "
+msgstr "დამატებითი პაკეტები დასაყენებლად (გამოტოვებით გამოყოფილი, გამოსატოვებლად ცარიელი დატოვეთ): "
+
+msgid "Copy ISO network configuration to installation"
+msgstr "ISO-ის ქსელის კონფიგურაციის კოპირება დაყენების დროს"
+
+msgid "Use NetworkManager (necessary to configure internet graphically in GNOME and KDE)"
+msgstr "NetworkManager-ის გამოყენება (აუცილებელია ინტერნეტის GNOME/KDE-დან მოსარგებად)"
+
+msgid "Select one network interface to configure"
+msgstr "მოსარგებად ერთ-ერთი ქსელის ინტერფეისი აირჩიეთ"
+
+msgid "Select which mode to configure for \"{}\" or skip to use default mode \"{}\""
+msgstr "აირჩიეთ მოსარგები რეჟიმი \"{}\"-სთვის ან გამოტოვეთ ნაგულისხმები რეჟიმის \"{}\" გამოსაყენებლად"
+
+msgid "Enter the IP and subnet for {} (example: 192.168.0.5/24): "
+msgstr "შეიყვანეთ IP მისამართი და ქვექსელი {}-სთვის (მაგ: 192.168.0.5/24): "
+
+msgid "Enter your gateway (router) IP address or leave blank for none: "
+msgstr "აირჩიეთ ნაგულისხმები რაუტერის IP მისამართი, ან ცარიელი დატოვეთ: "
+
+msgid "Enter your DNS servers (space separated, blank for none): "
+msgstr "შეიყვანეთ თქვენი DNS სერვერების მისამართები (გამოყოფილი ცარიელი ადგილით. ცარიელი, თუ არ გნებავთ, გამოიყენოთ): "
+
+msgid "Select which filesystem your main partition should use"
+msgstr "რომელ ფაილურ სისტემას გამოიყენებს თქვენი მთავარი დანაყოფი"
+
+msgid "Current partition layout"
+msgstr "მიმდინარე დანაყოფების განლაგება"
+
+msgid ""
+"Select what to do with\n"
+"{}"
+msgstr ""
+"აირჩიეთ, რა მოუვა\n"
+"{}"
+
+msgid "Enter a desired filesystem type for the partition"
+msgstr "შეიყვანეთ დანაყოფის სასურველი ფაილური სისტემის ტიპი"
+
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
+
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
+
+msgid "{} contains queued partitions, this will remove those, are you sure?"
+msgstr "{} რიგში ჩაყენებულ დანაყოფებს შეიცავს. ეს წაშლის მათ. დარწმუნებული ბრძანდებით?"
+
+msgid ""
+"{}\n"
+"\n"
+"Select by index which partitions to delete"
+msgstr ""
+"{}\n"
+"\n"
+"წასაშლელი დანაყოფების ინდექსით არჩევა"
+
+msgid ""
+"{}\n"
+"\n"
+"Select by index which partition to mount where"
+msgstr ""
+"{}\n"
+"\n"
+"ინდექსით არჩევა, რომელი დანაყოფი სად იქნება მიმაგრებული"
+
+msgid " * Partition mount-points are relative to inside the installation, the boot would be /boot as an example."
+msgstr " * დანაყოფის მიმაგრების წერტილები შედარებითია დაყენების შიგნით. ჩატვირთვა, მაგალითად, /boot შეიძლება, იყოს."
+
+msgid "Select where to mount partition (leave blank to remove mountpoint): "
+msgstr "აირჩიეთ, სად გნებავთ მიამაგროთ დანაყოფი (მიმაგრების წერტილის წასაშლელად დატოვეთ ის ცარიელი): "
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to mask for formatting"
+msgstr ""
+"{}\n"
+"\n"
+"აირჩიეთ, რომელი დანაყოფი იქნება მონიშნული ფორმატირებისთვის"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to mark as encrypted"
+msgstr ""
+"{}\n"
+"\n"
+"აირჩიეთ, რომელი დანაყოფი მოინიშნება, როგორც დაშიფრული"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to mark as bootable"
+msgstr ""
+"{}\n"
+"\n"
+"აირჩიეთ, რომელი დანაყოფი მოინიშნება, როგორც ჩატვირთვადი"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to set a filesystem on"
+msgstr ""
+"{}\n"
+"\n"
+"აირჩიეთ, ფაილური სისტემა რომელ დანაყოფზე დავაყენო"
+
+msgid "Enter a desired filesystem type for the partition: "
+msgstr "შეიყვანეთ დანაყოფის სასურველი ფაილური სისტემის ტიპი: "
+
+msgid "Archinstall language"
+msgstr "Archinstall-ის ენა"
+
+msgid "Wipe all selected drives and use a best-effort default partition layout"
+msgstr "მონიშნულ დისკებზე ყველაფრის წაშლა და დანაყოფების განლაგების საუკეთესო განლაგების გამოყენება"
+
+msgid "Select what to do with each individual drive (followed by partition usage)"
+msgstr "აირჩიეთ, რა ვუყო ინდივიდუალურ დისკს (დანაყოფების გამოყენების შემდეგ)"
+
+msgid "Select what you wish to do with the selected block devices"
+msgstr "აირჩიეთ, მონიშნულ ბლოკურ მოწყობილობებს რა გნებავთ, უქნათ"
+
+msgid "This is a list of pre-programmed profiles, they might make it easier to install things like desktop environments"
+msgstr "ეს წინასწარ მითითებული პროფილების სიაა. მათი დახმარებით ისეთი რამების, როგორიცაა სამუშაო მაგიდის გარემოები, დაყენება უფრო ადვილია"
+
+msgid "Select keyboard layout"
+msgstr "აირჩიეთ კლავიატურის განლაგება"
+
+msgid "Select one of the regions to download packages from"
+msgstr "აირჩიეთ რეგიონი პაკეტების გადმოსაწერად"
+
+msgid "Select one or more hard drives to use and configure"
+msgstr "აირჩიეთ ერთი ან მეტი მყარი დისკი და მოირგეთ"
+
+msgid "For the best compatibility with your AMD hardware, you may want to use either the all open-source or AMD / ATI options."
+msgstr "თქვენს AMD-ის აპარატურასთან საუკეთესო თავსებადობისთვის შეგიძლიათ როგორც სრულად ღია კოდის მქონე, ისე AMD/ATI-ის ვარიანტები გამოიყენოთ."
+
+msgid "For the best compatibility with your Intel hardware, you may want to use either the all open-source or Intel options.\n"
+msgstr "Intel-ის აპარატურასთან საუკეთესო თავსებადობისთვის შეგიძლიათ მათი სრულად ღია კოდის მქონე ვარიანტი გამოიყენოთ.\n"
+
+msgid "For the best compatibility with your Nvidia hardware, you may want to use the Nvidia proprietary driver.\n"
+msgstr "Nvidia-ის თქვენს აპარატურასთან საუკეთესო თავსებადობისთვის შეიძლება Nvidia-ის დახურული კოდის მქონე დრაივერის დაყენება გნებავდეთ.\n"
+
+msgid ""
+"\n"
+"\n"
+"Select a graphics driver or leave blank to install all open-source drivers"
+msgstr ""
+"\n"
+"\n"
+"აირჩიეთ გრაფიკის დრაივერი ან, ღია კოდის მქონე დრაივერის დასაყენებლად, ცარიელი დატოვეთ"
+
+msgid "All open-source (default)"
+msgstr "ყველა ღია კოდით (ნაგულისხმები)"
+
+msgid "Choose which kernels to use or leave blank for default \"{}\""
+msgstr "აირჩიეთ, რომელი ბირთვი გნებავთ, გამოიყენოთ. ან ნაგულისხმებისთვის (\"{}\") ცარიელი დატოვეთ"
+
+msgid "Choose which locale language to use"
+msgstr "აირჩიეთ, რომელი ლოკალის ენა გნებავთ, გამოიყენოთ"
+
+msgid "Choose which locale encoding to use"
+msgstr "აირჩიეთ, რომელი ლოკალის კოდირება გნებავთ, გამოიყენოთ"
+
+msgid "Select one of the values shown below: "
+msgstr "აირჩიეთ ერთ-ერთი ქვემოთ მოყვანილი მნიშვნელობებიდან: "
+
+msgid "Select one or more of the options below: "
+msgstr "აირჩეთ ერთი ან მეტი პარამეტრი ქვემოდან: "
+
+msgid "Adding partition...."
+msgstr "დანაყოფის დამატება..."
+
+msgid "You need to enter a valid fs-type in order to continue. See `man parted` for valid fs-type's."
+msgstr "გასაგრძელებლად აუცილებელია სწორი fs-type შეიყვანოთ. ხელმისაწვდომი სიის სანახავად იხილეთ 'man parted'."
+
+msgid "Error: Listing profiles on URL \"{}\" resulted in:"
+msgstr "შეცდომა: URL-ზე \"{}\" პროფილების ჩამოთვლის შედეგია:"
+
+msgid "Error: Could not decode \"{}\" result as JSON:"
+msgstr "შეცდომა: \"{}\" შედეგის JSON-ის სახით გაშიფვრა შეუძლებელია:"
+
+msgid "Keyboard layout"
+msgstr "კლავიატურის განლაგება"
+
+msgid "Mirror region"
+msgstr "სარკის რეგიონი"
+
+msgid "Locale language"
+msgstr "ლოკალის ენა"
+
+msgid "Locale encoding"
+msgstr "ლოკალის კოდირება"
+
+msgid "Drive(s)"
+msgstr "დისკები"
+
+msgid "Disk layout"
+msgstr "დისკის განლაგება"
+
+msgid "Encryption password"
+msgstr "დაშიფვრის პაროლი"
+
+msgid "Swap"
+msgstr "სვოპი"
+
+msgid "Bootloader"
+msgstr "ჩამტვირთავი"
+
+msgid "Root password"
+msgstr "Root-ის პაროლი"
+
+msgid "Superuser account"
+msgstr "ზემომხმარებლის ანგარიში"
+
+msgid "User account"
+msgstr "მომხმარებლის ანგარიში"
+
+msgid "Profile"
+msgstr "პროფილი"
+
+msgid "Audio"
+msgstr "აუდიო"
+
+msgid "Kernels"
+msgstr "ბირთვები"
+
+msgid "Additional packages"
+msgstr "დამატებითი პაკეტები"
+
+msgid "Network configuration"
+msgstr "ქსელის მორგება"
+
+msgid "Automatic time sync (NTP)"
+msgstr "დროის ავტომატური სინქრონიზაცია (NTP)"
+
+msgid "Install ({} config(s) missing)"
+msgstr "დაყენება (აკლია {} კონფიგურაცია)"
+
+msgid ""
+"You decided to skip harddrive selection\n"
+"and will use whatever drive-setup is mounted at {} (experimental)\n"
+"WARNING: Archinstall won't check the suitability of this setup\n"
+"Do you wish to continue?"
+msgstr ""
+"გადაწყვიტეთ, გამოტოვოთ მყარი დისკის არჩევანი\n"
+"და გამოიყენოთ ის, რაც {}-ზეა მიმაგრებული (ექსპერიმენტალური)\n"
+"გაფრთხილება: Archinstall-ს ამ მორგების სტაბილურობის გადამოწმება არ შეუძლია.\n"
+"გნებავთ, გააგრძელოთ?"
+
+msgid "Re-using partition instance: {}"
+msgstr "დანაყოფის ასლის თავიდან გამოყენება: {}"
+
+msgid "Create a new partition"
+msgstr "ახალი დანაყოფის შექმნა"
+
+msgid "Delete a partition"
+msgstr "დანაყოფის წაშლა"
+
+msgid "Clear/Delete all partitions"
+msgstr "დანაყოფების გასუფთავება/წაშლა"
+
+msgid "Assign mount-point for a partition"
+msgstr "დანაყოფის მიმაგრების წერტილის მინიჭება"
+
+msgid "Mark/Unmark a partition to be formatted (wipes data)"
+msgstr "დანაყოფის დასაფორმატებლობის ჭდის მოხსნა/დადება (მონაცემები წაიშლება)"
+
+msgid "Mark/Unmark a partition as encrypted"
+msgstr "დანაყოფის დაშიფრულობის ჭდის დადება/მოხსნა"
+
+msgid "Mark/Unmark a partition as bootable (automatic for /boot)"
+msgstr "დანაყოფის ჩატვირთვადობის ჭდის მოხსნა/დადება (ავტომატურია /boot-სთვის)"
+
+msgid "Set desired filesystem for a partition"
+msgstr "აირჩიეთ დანაყოფის სასურველი ფაილური სისტემა"
+
+msgid "Abort"
+msgstr "გაუქმება"
+
+msgid "Hostname"
+msgstr "ჰოსტის სახელი"
+
+msgid "Not configured, unavailable unless setup manually"
+msgstr "მორგებული არაა. მიუწვდომელია, სანამ ხელით არ მოირგებთ"
+
+msgid "Timezone"
+msgstr "დროის სარტყელი"
+
+msgid "Set/Modify the below options"
+msgstr "დააყენეთ/შეცვალეთ ქვედა პარამეტრები"
+
+msgid "Install"
+msgstr "დაყენება"
+
+msgid ""
+"Use ESC to skip\n"
+"\n"
+msgstr ""
+"გამოსატოვებლად გამოიყენეთ ღილაკი Esc\n"
+"\n"
+
+msgid "Suggest partition layout"
+msgstr "დანაყოფების განლაგების მინიშნება"
+
+msgid "Enter a password: "
+msgstr "შეიყვანეთ პაროლი: "
+
+msgid "Enter a encryption password for {}"
+msgstr "შეიყვანეთ {}-ის დაშიფვრის პაროლი"
+
+msgid "Enter disk encryption password (leave blank for no encryption): "
+msgstr "შეიყვანეთ დისკის დაშიფვრის პაროლი (დაშიფვრის გასათიშად დატოვეთ ცარიელი): "
+
+msgid "Create a required super-user with sudo privileges: "
+msgstr "Sudo-ის პრივილეგიების სმქონე აუცილებელი ზემომხმარებლის: "
+
+msgid "Enter root password (leave blank to disable root): "
+msgstr "შეიყვანეთ root-ის პაროლი (თუ გნებავთ, გათიშოთ root, ცარიელი დატოვეთ): "
+
+msgid "Password for user \"{}\": "
+msgstr "პაროლი მომხმარებლისთვის \"{}\": "
+
+msgid "Verifying that additional packages exist (this might take a few seconds)"
+msgstr "დამატებითი პაკეტების არსებობის შემოწმება (ამას რამდენიმე წამი შეიძლება დასჭირდეს)"
+
+msgid "Would you like to use automatic time synchronization (NTP) with the default time servers?\n"
+msgstr "გნებავთ დროის ავტომატური სინქრონიზაციის (NTP) ნაგულისხმები დროის სერვერებით გამოყენება?\n"
+
+msgid ""
+"Hardware time and other post-configuration steps might be required in order for NTP to work.\n"
+"For more information, please check the Arch wiki"
+msgstr ""
+"NTP-ის ასამუშავებლად აპარატურული დრო და სხვა დაყენების-შემდგომი ნაბიჯები დაგჭირდებათ.\n"
+"მეტი ინფორმაციისთვის იხილეთ Arch-ის დოკუმენტაცია"
+
+msgid "Enter a username to create an additional user (leave blank to skip): "
+msgstr "დამატებითი მომხმარებლის შესაქმნელად შეიყვანეთ მისი სახელი (გამოსატოვებლად ცარიელი დატოვეთ): "
+
+msgid "Use ESC to skip\n"
+msgstr "გამოსატოვებლად გამოიყენეთ ღილაკი Esc\n"
+
+msgid ""
+"\n"
+" Choose an object from the list, and select one of the available actions for it to execute"
+msgstr ""
+"\n"
+" შესასრულებლად აირჩიეთ ობიექტი სიიდან და აირჩიეთ მისთვის ხელმისაწვდომი ქმედება"
+
+msgid "Cancel"
+msgstr "შეწყვეტა"
+
+msgid "Confirm and exit"
+msgstr "დადასტურება და გასვლა"
+
+msgid "Add"
+msgstr "დამატება"
+
+msgid "Copy"
+msgstr "კოპირება"
+
+msgid "Edit"
+msgstr "ჩასწორება"
+
+msgid "Delete"
+msgstr "წაშლა"
+
+msgid "Select an action for '{}'"
+msgstr "აირჩიეთ ქმედება '{}'-სთვის"
+
+msgid "Copy to new key:"
+msgstr "ახალ გასაღებში კოპირება:"
+
+msgid "Unknown nic type: {}. Possible values are {}"
+msgstr "NIC-ის უცნობი ტიპი: {}. შესაძლო მნიშვნელობებია {}"
+
+msgid ""
+"\n"
+"This is your chosen configuration:"
+msgstr ""
+"\n"
+"ეს თქვენი არჩეული კონფიგურაციაა:"
+
+msgid "Pacman is already running, waiting maximum 10 minutes for it to terminate."
+msgstr "Pacman- უკვე გაშვებულია. მოკვლამდე 10 წუთი დაველოდები."
+
+msgid "Pre-existing pacman lock never exited. Please clean up any existing pacman sessions before using archinstall."
+msgstr "წინასწარ packman-ის ბლოკი არასდროს არსებობდა. Archinstall-ის დაყენებამდე აუცილებელია pacman-ს სესიების მოსუფთავება აუცილებელია."
+
+msgid "Choose which optional additional repositories to enable"
+msgstr "აირჩიეთ, რომელი არასავალდებულო დამატებითი რეპოზიტორია გნებავთ, ჩართოთ"
+
+msgid "Add a user"
+msgstr "მომხმარებლის დამატება"
+
+msgid "Change password"
+msgstr "პაროლის შეცვლა"
+
+msgid "Promote/Demote user"
+msgstr "მომხმარებლის დაწინაურება/ჩამოქვეითება"
+
+msgid "Delete User"
+msgstr "მომხმარებლის წაშლა"
+
+msgid ""
+"\n"
+"Define a new user\n"
+msgstr ""
+"\n"
+"აღწერეთ ახალი მომხმარებელი\n"
+
+msgid "User Name : "
+msgstr "მომხმარებლის სახელი : "
+
+msgid "Should {} be a superuser (sudoer)?"
+msgstr "იყოს {} ზემომხმარებელი (sudoer)?"
+
+msgid "Define users with sudo privilege: "
+msgstr "აღწერეთ sudo პრივილეგიის მქონე მომხმარებლები: "
+
+msgid "No network configuration"
+msgstr "ქსელის მორგების გარეშე"
+
+msgid "Set desired subvolumes on a btrfs partition"
+msgstr "დააყენეთ Btrfs დანაყოფის სასურველი ქვეტომები"
+
+msgid ""
+"{}\n"
+"\n"
+"Select which partition to set subvolumes on"
+msgstr ""
+"{}\n"
+"\n"
+"აირჩიეთ, რომელ დანაყოფზე აპირებთ ქვეტომების დაყენებას"
+
+msgid "Manage btrfs subvolumes for current partition"
+msgstr "Btrfs-ის ქვეტომების მართვა მიმდინარე დანაყოფისთვის"
+
+msgid "No configuration"
+msgstr "მორგების გარეშე"
+
+msgid "Save user configuration"
+msgstr "მომხმარებლის კონფიგურაციის შენახვა"
+
+msgid "Save user credentials"
+msgstr "მომხმარებლის ავტორიზაციის დეტალების შენახვა"
+
+msgid "Save disk layout"
+msgstr "დისკის განლაგების შენახვა"
+
+msgid "Save all"
+msgstr "ყველაფრის შენახვა"
+
+msgid "Choose which configuration to save"
+msgstr "აირჩიეთ, რომელი კონფიგურაცია შევინახო"
+
+msgid "Enter a directory for the configuration(s) to be saved: "
+msgstr "შეიყვანეთ საქაღალდე, სადაც კონფიგურაცი(ებ)-ი იქნება შენახული: "
+
+msgid "Not a valid directory: {}"
+msgstr "არასწორი საქაღალდე: {}"
+
+msgid "The password you are using seems to be weak,"
+msgstr "პაროლი, რომელიც შეიყვანეთ, სუსტია,"
+
+msgid "are you sure you want to use it?"
+msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, გამოიყენოთ ის?"
+
+msgid "Optional repositories"
+msgstr "არასავალდებულო რეპოზიტორიები"
+
+msgid "Save configuration"
+msgstr "კონფიგურაციი შენახვა"
+
+msgid "Missing configurations:\n"
+msgstr "ნაკლული კონფიგურაციები:\n"
+
+msgid "Either root-password or at least 1 superuser must be specified"
+msgstr "შეიყვანეთ root-ის პაროლი ან მიუთითეთ 1 ზემომხმარებელი მაინც"
+
+msgid "Manage superuser accounts: "
+msgstr "ზემომხმარებლის ანგარიშების მართვა: "
+
+msgid "Manage ordinary user accounts: "
+msgstr "ჩვეულებრივი მომხმარებლის ანგარიშების მართვა: "
+
+msgid " Subvolume :{:16}"
+msgstr " ქვეტომი :{:16}"
+
+msgid " mounted at {:16}"
+msgstr " მიმაგრების წერტილი {:16}"
+
+msgid " with option {}"
+msgstr " პარამეტრით {}"
+
+msgid ""
+"\n"
+" Fill the desired values for a new subvolume \n"
+msgstr ""
+"\n"
+"შეავსეთ სასურველი მნიშვნელობები ახალი ქვეტომისთვის \n"
+
+msgid "Subvolume name "
+msgstr "ქვეტომის სახელი "
+
+msgid "Subvolume mountpoint"
+msgstr "ქვეტომის მიმაგრების წერტილი"
+
+msgid "Subvolume options"
+msgstr "ქვეტომის მორგება"
+
+msgid "Save"
+msgstr "შენახვა"
+
+msgid "Subvolume name :"
+msgstr "ქვეტომის სახელი :"
+
+msgid "Select a mount point :"
+msgstr "აირჩიეთ მიმაგრების წერტილი :"
+
+msgid "Select the desired subvolume options "
+msgstr "აირჩიეთ სასურველი ქვეტომის პარამეტრები "
+
+msgid "Define users with sudo privilege, by username: "
+msgstr "აღწერეთ sudo-ის პრივილეგიების მქონე მომხმარებლები, მათი სახელით: "
+
+msgid "[!] A log file has been created here: {}"
+msgstr "[!] ჟურნალის ფაილის მდებარეობა: {}"
+
+msgid "Would you like to use BTRFS subvolumes with a default structure?"
+msgstr "გნებავთ BTRFS-ის ქვეტომები ნაგულისხმები სტრუქტურით გამოიყენოთ?"
+
+msgid "Would you like to use BTRFS compression?"
+msgstr "გნებავთ BTRFS-ის შეკუმშვის გამოყენება?"
+
+msgid "Would you like to create a separate partition for /home?"
+msgstr "გნებავთ /home-სთვის ცალკე დანაყოფი შექმნათ?"
+
+msgid "The selected drives do not have the minimum capacity required for an automatic suggestion\n"
+msgstr "მონიშნულ დისკებზე ავტომატურად დასაყენებლად საკმარისი მინიმალური ადგილი აღმოჩენილი არაა\n"
+
+msgid "Minimum capacity for /home partition: {}GB\n"
+msgstr "მინიმალური სივრცე დანაყოფისთვის /home: {}გბ\n"
+
+msgid "Minimum capacity for Arch Linux partition: {}GB"
+msgstr "მინიმალური სივრცე ArchLinux-ის დანაყოფისთვის: {}გბ"
+
+msgid "Continue"
+msgstr "გაგრძელება"
+
+msgid "yes"
+msgstr "დიახ"
+
+msgid "no"
+msgstr "არა"
+
+msgid "set: {}"
+msgstr "დაყენება: {}"
+
+msgid "Manual configuration setting must be a list"
+msgstr "მორგებული კონფიგურაციის პარამეტრი სია უნდა იყოს"
+
+msgid "No iface specified for manual configuration"
+msgstr "მორგებული კონფიგურაციისთვის ინტერფეისი მითითებული არაა"
+
+msgid "Manual nic configuration with no auto DHCP requires an IP address"
+msgstr "NIC-ის DHCP-ის გარეშე მოსარგებად IP მისამართის მითითება აუცილებელია"
+
+msgid "Add interface"
+msgstr "ინტერფეისის დამატება"
+
+msgid "Edit interface"
+msgstr "ინტერფეისის ჩასწორება"
+
+msgid "Delete interface"
+msgstr "ინტერფეისის წაშლა"
+
+msgid "Select interface to add"
+msgstr "აირჩიეთ დასამატებელი ინტერფეისი"
+
+msgid "Manual configuration"
+msgstr "ხელით მორგება"
+
+msgid "Mark/Unmark a partition as compressed (btrfs only)"
+msgstr "დანაყოფზე შეკუმშულობის ჭდის მოხსნა/დადება (მხოლოდ btrfs)"
+
+msgid "The password you are using seems to be weak, are you sure you want to use it?"
+msgstr "როგორც ჩანს პაროლი, რომელსაც იყენებთ, სუსტია. დარწმუნებული ბრძანდებით, რომ გნებავთ, გამოიყენოთ ის?"
+
+msgid "Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway"
+msgstr "მოგაწვდით სამუშაო გარემოებისა და ფანჯრების მმართველების არჩევანს. მაგ: gnome, kde, sway"
+
+msgid "Select your desired desktop environment"
+msgstr "აირჩიეთ სასურველი სამუშაო მაგიდის გარემო"
+
+msgid "A very basic installation that allows you to customize Arch Linux as you see fit."
+msgstr "მინიმალური დაყენება, რომელიც საშუალებას გაძლევთ, Arch Linux სურვილისამებრ მოირგოთ."
+
+msgid "Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb"
+msgstr "სერვერის ისეთი პაკეტების დაყენება და ჩართვა, როგორიცაა httpd, nginx, mariadb"
+
+msgid "Choose which servers to install, if none then a minimal installation will be done"
+msgstr "აირჩიეთ, რომელი სერვერების დაყენება გნებავთ. თუ არაფერს შეიყვანთ, მინიმალური დაყენება მოხდება"
+
+msgid "Installs a minimal system as well as xorg and graphics drivers."
+msgstr "აყენებს მინიმალურ სისტემას, ასევე xorg-ს და გრაფიკის დრაივერებს."
+
+msgid "Press Enter to continue."
+msgstr "გასაგრძელებლად დააჭირეთ Enter-ს."
+
+msgid "Would you like to chroot into the newly created installation and perform post-installation configuration?"
+msgstr "გნებავთ chroot ახალ დაყენებულ სისტემაში და დაყენების შემდეგი კონფიგურაციის გაშვება?"
+
+msgid "Are you sure you want to reset this setting?"
+msgstr "დარწმუნებული ბრძანდებით, რომ გნებავთ, დააბრუნოთ ეს პარამეტრი?"
+
+msgid "Select one or more hard drives to use and configure\n"
+msgstr "მოსარგებად და გამოსაყენებლად აირჩიეთ ერთი ან მეტი მყარი დისკი\n"
+
+msgid "Any modifications to the existing setting will reset the disk layout!"
+msgstr "არსებული პარამეტრის ნებისმიერი ცვლილება დისკის განლაგებას საწყის მნიშვნელობებზე დააბრუნებს!"
+
+msgid "If you reset the harddrive selection this will also reset the current disk layout. Are you sure?"
+msgstr "ეს მყარი დისკის არჩევანს და მიმდინარე დისკის განლაგებას საწყის მნიშვნელობებზე დააბრუნებს. დარწმუნებული ბრძანდებით?"
+
+msgid "Save and exit"
+msgstr "შენახვა და გასვლა"
+
+msgid ""
+"{}\n"
+"contains queued partitions, this will remove those, are you sure?"
+msgstr ""
+"{}\n"
+"რიგში ჩაყენებულ დანაყოფებს შეიცავს. ეს წაშლის მათ. დარწმუნებული ბრძანდებით?"
+
+msgid "No audio server"
+msgstr "აუდიოსერვერის გრეშე"
+
+msgid "(default)"
+msgstr "(ნაგულისხმები)"
+
+msgid "Use ESC to skip"
+msgstr "გამოსატოვებლად გამოიყენეთ ღილაკი Esc"
+
+msgid ""
+"Use CTRL+C to reset current selection\n"
+"\n"
+msgstr ""
+"მიმდინარე მონიშვნის დასაბრუნებლად დააწექით CTRL+C\n"
+"\n"
+
+msgid "Copy to: "
+msgstr "კოპირება: "
+
+msgid "Edit: "
+msgstr "ჩასწორება: "
+
+msgid "Key: "
+msgstr "გასაღები: "
+
+msgid "Edit {}: "
+msgstr "ჩასწორება {}: "
+
+msgid "Add: "
+msgstr "დამატება: "
+
+msgid "Value: "
+msgstr "მნიშვნელობა: "
+
+msgid "You can skip selecting a drive and partitioning and use whatever drive-setup is mounted at /mnt (experimental)"
+msgstr "შეგიძლიათ დისკის არჩევანი და დაყოფა გამოტოვოთ და გამოიყენოთ სასურველი დისკი, რომელიც /mnt-ზეა მიმაგრებული (ექსპერიმენტალური)"
+
+msgid "Select one of the disks or skip and use /mnt as default"
+msgstr "აირჩიეთ ერტი ან მეტი დისკი ან გამოტოვება და ნაგულისხმები /mnt-ის გამოყენება"
+
+msgid "Select which partitions to mark for formatting:"
+msgstr "აირჩიეთ, რომელი დანაყოფები მოვნიშნო დასაფორმატებლად:"
+
+msgid "Use HSM to unlock encrypted drive"
+msgstr "დაშიფრული დისკის გასახსნელად HSM-ის გამოყენება"
+
+msgid "Device"
+msgstr "მოწყობილობა"
+
+msgid "Size"
+msgstr "ზომა"
+
+msgid "Free space"
+msgstr "თავისუფალი ადგილი"
+
+msgid "Bus-type"
+msgstr "მატარებლის-ტიპი"
+
+msgid "Either root-password or at least 1 user with sudo privileges must be specified"
+msgstr "Root-ის პაროლის ან მინიმუმ 1 sudo-ის პრივილეგიების მქონე მომხმარებლის მითითება აუცილებელია"
+
+msgid "Enter username (leave blank to skip): "
+msgstr "შეიყვანეთ მომხმარებლი სახელი (გამოსატოვებლად ცარიელი დატოვეთ): "
+
+msgid "The username you entered is invalid. Try again"
+msgstr "შეყვანილი მომხმარებლის სახელი არასწორია. კიდევ სცადეთ"
+
+msgid "Should \"{}\" be a superuser (sudo)?"
+msgstr "იყოს \"{}\" ზემომხმარებელი(sudo)?"
+
+msgid "Select which partitions to encrypt"
+msgstr "არჩიეთ დასაშიფრი დანაყოფები"
+
+msgid "very weak"
+msgstr "ძალიან სუსტი"
+
+msgid "weak"
+msgstr "სუსტი"
+
+msgid "moderate"
+msgstr "საშუალო"
+
+msgid "strong"
+msgstr "ძლიერი"
+
+msgid "Add subvolume"
+msgstr "ქვეტომის დამატება"
+
+msgid "Edit subvolume"
+msgstr "ქვეტომის ჩასწორება"
+
+msgid "Delete subvolume"
+msgstr "ქვეტომის წაშლა"
+
+msgid "Configured {} interfaces"
+msgstr "მორგებულია {} ინტერფეისი"
+
+msgid "This option enables the number of parallel downloads that can occur during installation"
+msgstr "ეს პარამეტრი დაყენებისას მითითებული რაოდენობის პარალელურ გადმოწერას დაუშვებს"
+
+#, python-brace-format
+msgid ""
+"Enter the number of parallel downloads to be enabled.\n"
+" (Enter a value between 1 to {max_downloads})\n"
+"Note:"
+msgstr ""
+"შეიყვანეთ დასაშვები პარალელური გადმოწერების რაოდენობა.\n"
+" (შეიყვანეთ მნიშვნელობა 1-დან {max_downloads}-მდე)\n"
+"დაიმახსოვრეთ:"
+
+msgid " - Maximum value : {max_downloads} ( Allows {max_downloads} parallel downloads, allows {max_downloads+1} downloads at a time )"
+msgstr " - მინიმალური მნიშვნელობა : {max_downloads} ( დაუშვებს {max_downloads} პარალელურ გადმოწერას, დაუშვებს {max_downloads+1} ერთდროულ გადმოწერას )"
+
+msgid " - Minimum value : 1 ( Allows 1 parallel download, allows 2 downloads at a time )"
+msgstr " - მინიმალური მნიშვნელობა : 1 ( დაუშვებს 1 პარალელურ გადმოწერას, დაუშვებს 2 ერთდროულ გადმოწერას )"
+
+msgid " - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )"
+msgstr " - გამორთვა/ნაგულისხმები : 0 ( პარალელური გადმოწერების გათიშვა. დროის ერთ მომენტში მხოლოდ ერთი გადმოწერა მოხდება )"
+
+#, python-brace-format
+msgid "Invalid input! Try again with a valid input [1 to {max_downloads}, or 0 to disable]"
+msgstr "შეყვანილი რიცხვი არასწორია! თავიდან სცადეთ [1-დან {max_downloads}-მდე, ან 0, გასათიშად]"
+
+msgid "Parallel Downloads"
+msgstr "პარალელური გადმოწერები"
+
+msgid "ESC to skip"
+msgstr "გამოსატოვებლად ღილაკი Esc"
+
+msgid "CTRL+C to reset"
+msgstr "დასაბრუნებლად CTRL+C"
+
+msgid "TAB to select"
+msgstr "ასარჩევად TAB"
+
+msgid "[Default value: 0] > "
+msgstr "[ნაგულისხმები მნიშვნელობა: 0] > "
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr "თარგმანის გამოსაყენებლად ფონტი, რომელსაც ენის მხარდაჭერა გააჩნია, ხელით უნდა დააყენოთ."
+
+msgid "The font should be stored as {}"
+msgstr "ფონტი {}-ში უნდა იყოს შენახული"
+
+msgid "Encryption type"
+msgstr "დაშიფვრის ტიპი"
+
+msgid "Partitions"
+msgstr "დანაყოფები"
+
+msgid "No HSM devices available"
+msgstr "HSM მოწყობილობები მიუწვდომელია"
+
+msgid "Partitions to be encrypted"
+msgstr "დასაშიფრი დანაყოფები"
+
+msgid "Select disk encryption option"
+msgstr "აირჩიეთ დისკის დაშიფვრის პარამეტრი"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr "აირჩიეთ HSM-სთვის გამოსაყენებელი FIDO2 მოწყობილობა"
+
+msgid "All settings will be reset, are you sure?"
+msgstr "ყველა პარამეტრი დაბრუნდება. დარწმუნებული ბრძანდებით?"
+
+msgid "Back"
+msgstr "უკან"
+
+msgid "Disk encryption"
+msgstr "დისკის დაშიფვრა"
+
+msgid "Password"
+msgstr "პაროლი"
+
+msgid "Partition encryption"
+msgstr "დანაყოფის დაშიფვრა"
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "შეიყვანეთ საწყისი სექტორი (პროცენტებში ან ბლოკის ნომერი. ნაგულისხმები: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "შეიყვანეთ დანაყოფის ბოლო სექტორი (პროცენტულად ან ბლოკის ნომერი. მაგ: {}): "
diff --git a/archinstall/locales/ko/LC_MESSAGES/base.mo b/archinstall/locales/ko/LC_MESSAGES/base.mo
index 9f86dafd..4c89f1f8 100644
--- a/archinstall/locales/ko/LC_MESSAGES/base.mo
+++ b/archinstall/locales/ko/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/ko/LC_MESSAGES/base.po b/archinstall/locales/ko/LC_MESSAGES/base.po
index b0a85c64..4363031e 100644
--- a/archinstall/locales/ko/LC_MESSAGES/base.po
+++ b/archinstall/locales/ko/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "파티션에 대해 원하는 파일 시스템 유형을 입력하세요"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "시작 섹터를 입력하세요 (백분율 또는 블록 번호, 기본값: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "파티션의 끝 섹터를 입력하세요 (백분율 또는 블록 번호, 예시: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} 에 대기 중인 파티션이 포함되어 있습니다. 그러면 이러한 파티션이 제거됩니다. 정말 진행하시겠습니까?"
@@ -763,7 +763,8 @@ msgstr "입력한 사용자 이름이 잘못되었습니다. 다시 시도하세
msgid "Should \"{}\" be a superuser (sudo)?"
msgstr "\"{}\"은(는) 슈퍼유저여야 합니까 (sudo)?"
-msgid "Select which partitions to encrypt:"
+#, fuzzy
+msgid "Select which partitions to encrypt"
msgstr "암호화할 파티션을 선택하세요:"
msgid "very weak"
@@ -836,3 +837,46 @@ msgstr "이 번역을 사용하려면 해당 언어를 지원하는 글꼴을
msgid "The font should be stored as {}"
msgstr "글꼴은 {} (으)로 저장해야 합니다"
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "비밀번호 암호화"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "암호화할 파티션을 선택하세요:"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} 에 대기 중인 파티션이 포함되어 있습니다. 그러면 이러한 파티션이 제거됩니다. 정말 진행하시겠습니까?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "루트 비밀번호"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "시작 섹터를 입력하세요 (백분율 또는 블록 번호, 기본값: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "파티션의 끝 섹터를 입력하세요 (백분율 또는 블록 번호, 예시: {}): "
diff --git a/archinstall/locales/languages.json b/archinstall/locales/languages.json
index 2c876041..1e33dcde 100644
--- a/archinstall/locales/languages.json
+++ b/archinstall/locales/languages.json
@@ -68,7 +68,7 @@
{"abbr": "iu", "lang": "Inuktitut"},
{"abbr": "ie", "lang": "Interlingue"},
{"abbr": "ia", "lang": "Interlingua (International Auxiliary Language Association)"},
- {"abbr": "id", "lang": "Indonesian", "translated_lang": "Indonesia"},
+ {"abbr": "id", "lang": "Indonesian", "translated_lang": "Indonesian"},
{"abbr": "ik", "lang": "Inupiaq"},
{"abbr": "is", "lang": "Icelandic"},
{"abbr": "it", "lang": "Italian", "translated_lang": "Italiano"},
@@ -146,7 +146,7 @@
{"abbr": "sd", "lang": "Sindhi"},
{"abbr": "so", "lang": "Somali"},
{"abbr": "st", "lang": "Southern Sotho"},
- {"abbr": "es", "lang": "Spanish", "translated_lang": "Española"},
+ {"abbr": "es", "lang": "Spanish", "translated_lang": "Español"},
{"abbr": "sq", "lang": "Albanian"},
{"abbr": "sc", "lang": "Sardinian"},
{"abbr": "sr", "lang": "Serbian"},
diff --git a/archinstall/locales/nl/LC_MESSAGES/base.mo b/archinstall/locales/nl/LC_MESSAGES/base.mo
index 62b7af82..222f21e9 100644
--- a/archinstall/locales/nl/LC_MESSAGES/base.mo
+++ b/archinstall/locales/nl/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/nl/LC_MESSAGES/base.po b/archinstall/locales/nl/LC_MESSAGES/base.po
index b7323059..7f3de195 100644
--- a/archinstall/locales/nl/LC_MESSAGES/base.po
+++ b/archinstall/locales/nl/LC_MESSAGES/base.po
@@ -97,11 +97,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Kies het gewenste bestandssysteem voor de partitie"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Voer de beginsector in (percentage of bloknummer - standaard: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Voer de eindsector in (percentage of bloknummer - bijvoorbeeld: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "‘{}’ bevat in behandeling zijnde partities, welke hierdoor worden verwijderd. Weet u zeker dat u wilt doorgaan?"
@@ -856,8 +856,58 @@ msgstr ""
msgid "TAB to select"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "Kies een schijfindeling"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Versleutelwachtwoord instellen"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Kies welke partitie moet worden versleuteld"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Kies een schijfindeling"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "‘{}’ bevat in behandeling zijnde partities, welke hierdoor worden verwijderd. Weet u zeker dat u wilt doorgaan?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Rootwachtwoord"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Voer de beginsector in (percentage of bloknummer - standaard: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Voer de eindsector in (percentage of bloknummer - bijvoorbeeld: {}): "
#~ msgid "Add :"
#~ msgstr "Toevoegen:"
diff --git a/archinstall/locales/pl/LC_MESSAGES/base.mo b/archinstall/locales/pl/LC_MESSAGES/base.mo
index 0e8e7bef..7ca4f9b0 100644
--- a/archinstall/locales/pl/LC_MESSAGES/base.mo
+++ b/archinstall/locales/pl/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/pl/LC_MESSAGES/base.po b/archinstall/locales/pl/LC_MESSAGES/base.po
index 6655bbbd..ec4fcbd4 100644
--- a/archinstall/locales/pl/LC_MESSAGES/base.po
+++ b/archinstall/locales/pl/LC_MESSAGES/base.po
@@ -1,14 +1,14 @@
msgid ""
msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
"Last-Translator: MedzikUser <medzik@duck.com>\n"
"Language-Team: \n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Project-Id-Version: \n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
"X-Generator: Poedit 2.4.2\n"
msgid "[!] A log file has been created here: {} {}"
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Wprowadź typ systemu plików dla partycji"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Wprowadź sektor początkowy (procent lub numer bloku, domyślnie: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Wprowadź sektor końcowy (procent lub numer bloku, domyślnie: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} zawiera partycje oczekujące w kolejce, to spowoduje ich usunięcie, czy jesteś pewien?"
@@ -830,8 +830,58 @@ msgstr "Naciśnij Ctrl+C, aby zresetować"
msgid "TAB to select"
msgstr "Naciśnij Tab, aby wybrać"
-#~ msgid "Select disk layout"
-#~ msgstr "Wybierz układ dysku"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Hasło szyfrujące"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Wybierz partycja która ma zostać zaszyfrowana"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Wybierz układ dysku"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} zawiera partycje oczekujące w kolejce, to spowoduje ich usunięcie, czy jesteś pewien?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Hasło użytkownika root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Wprowadź sektor początkowy (procent lub numer bloku, domyślnie: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Wprowadź sektor końcowy (procent lub numer bloku, domyślnie: {}): "
#~ msgid "Add :"
#~ msgstr "Dodaj :"
diff --git a/archinstall/locales/pt/LC_MESSAGES/base.mo b/archinstall/locales/pt/LC_MESSAGES/base.mo
index 113b26a6..99fd4b02 100644
--- a/archinstall/locales/pt/LC_MESSAGES/base.mo
+++ b/archinstall/locales/pt/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/pt/LC_MESSAGES/base.po b/archinstall/locales/pt/LC_MESSAGES/base.po
index 683de0ad..4f772aae 100644
--- a/archinstall/locales/pt/LC_MESSAGES/base.po
+++ b/archinstall/locales/pt/LC_MESSAGES/base.po
@@ -95,11 +95,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Escreve o tipo de sistema de ficheiros desejado para a partição"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Escreve o sector de início (percentagem ou número de bloco, padrão: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Escreve o sector final da partição (percentagem ou número de bloco, ex: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} contem partições em fila, isto irá remover essas, tens a certeza?"
@@ -878,8 +878,58 @@ msgstr ""
msgid "TAB to select"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "Seleciona o esquema de disco"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Define a palavra-passe de encriptação"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Seleciona a partição a marcar como encriptada"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Seleciona o esquema de disco"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} contem partições em fila, isto irá remover essas, tens a certeza?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Palavra-passe de root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Escreve o sector de início (percentagem ou número de bloco, padrão: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Escreve o sector final da partição (percentagem ou número de bloco, ex: {}): "
#~ msgid "Add :"
#~ msgstr "Adicionar :"
diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.mo b/archinstall/locales/pt_BR/LC_MESSAGES/base.mo
index 931e0ddf..bcffafbf 100644
--- a/archinstall/locales/pt_BR/LC_MESSAGES/base.mo
+++ b/archinstall/locales/pt_BR/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/pt_BR/LC_MESSAGES/base.po b/archinstall/locales/pt_BR/LC_MESSAGES/base.po
index 938f5068..33e78a20 100644
--- a/archinstall/locales/pt_BR/LC_MESSAGES/base.po
+++ b/archinstall/locales/pt_BR/LC_MESSAGES/base.po
@@ -94,11 +94,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Digite o tipo de sistema de arquivos desejado para a partição"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Digite o setor de início (porcentagem ou número do bloco, padrão: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Digite o setor final da partição (porcentagem ou número de bloco, ex.: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} contém partições em fila, isto irá removê-las, tem certeza?"
@@ -835,3 +835,46 @@ msgstr "Para poder usar esta tradução, instale manualmente uma fonte que supor
msgid "The font should be stored as {}"
msgstr "A fonte deve ser armazenada como {}"
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Senha de encriptação"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Selecione quais partições encriptar"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} contém partições em fila, isto irá removê-las, tem certeza?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Senha de root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Digite o setor de início (porcentagem ou número do bloco, padrão: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Digite o setor final da partição (porcentagem ou número de bloco, ex.: {}): "
diff --git a/archinstall/locales/ru/LC_MESSAGES/base.mo b/archinstall/locales/ru/LC_MESSAGES/base.mo
index 8b3f0ae4..0fe08128 100644
--- a/archinstall/locales/ru/LC_MESSAGES/base.mo
+++ b/archinstall/locales/ru/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/ru/LC_MESSAGES/base.po b/archinstall/locales/ru/LC_MESSAGES/base.po
index a62a8385..1a33881f 100644
--- a/archinstall/locales/ru/LC_MESSAGES/base.po
+++ b/archinstall/locales/ru/LC_MESSAGES/base.po
@@ -97,11 +97,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Введите желаемый тип файловой системы для раздела"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Введите начальный сектор (процент или номер блока, по умолчанию: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Введите конечный сектор раздела (процент или номер блока, например: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} содержит разделы в очереди, это удалит их, вы уверены?"
@@ -832,6 +832,55 @@ msgstr "TAB, чтобы выбрать"
msgid "[Default value: 0] > "
msgstr "[Значение по умолчанию: 0] > "
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr "Чтобы иметь возможность использовать этот перевод, пожалуйста, установите вручную шрифт, поддерживающий данный язык."
+
+msgid "The font should be stored as {}"
+msgstr "Шрифт должен быть сохранен как {}"
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Пароль шифрования"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Выберите разделы для шифрования"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} содержит разделы в очереди, это удалит их, вы уверены?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Пароль root"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Введите начальный сектор (процент или номер блока, по умолчанию: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Введите конечный сектор раздела (процент или номер блока, например: {}): "
+
#, python-brace-format
#~ msgid "Edit {origkey} :"
#~ msgstr "Редактировать {origkey}:"
diff --git a/archinstall/locales/sv/LC_MESSAGES/base.mo b/archinstall/locales/sv/LC_MESSAGES/base.mo
index f2798bd4..243f1d9f 100644
--- a/archinstall/locales/sv/LC_MESSAGES/base.mo
+++ b/archinstall/locales/sv/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/sv/LC_MESSAGES/base.po b/archinstall/locales/sv/LC_MESSAGES/base.po
index fc311551..61755a2c 100644
--- a/archinstall/locales/sv/LC_MESSAGES/base.po
+++ b/archinstall/locales/sv/LC_MESSAGES/base.po
@@ -97,11 +97,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Mata in önskad filsystemtyp för partition"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Mata in startsektor (procent eller block-nummer, standard: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Mata in slutsektor för partitionen (procent eller block-nummer, ex: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} innehåller uppköade partitionen och detta kommer ta bort dessa. Är du säker?"
@@ -837,5 +837,55 @@ msgstr ""
msgid "TAB to select"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "Välj hårddisk-layout"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Välj ett krypterings-lösenord"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Välj vilken partition som skall markeras för kryptering"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "Välj hårddisk-layout"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} innehåller uppköade partitionen och detta kommer ta bort dessa. Är du säker?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "root-lösenord"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Mata in startsektor (procent eller block-nummer, standard: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Mata in slutsektor för partitionen (procent eller block-nummer, ex: {}): "
diff --git a/archinstall/locales/ta/LC_MESSAGES/base.mo b/archinstall/locales/ta/LC_MESSAGES/base.mo
index 20b8a7f5..3f175509 100644
--- a/archinstall/locales/ta/LC_MESSAGES/base.mo
+++ b/archinstall/locales/ta/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/ta/LC_MESSAGES/base.po b/archinstall/locales/ta/LC_MESSAGES/base.po
index 4375f477..4f1d6762 100644
--- a/archinstall/locales/ta/LC_MESSAGES/base.po
+++ b/archinstall/locales/ta/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "பகிர்வுக்கு தேவையான கோப்பு முறைமை வகையை உள்ளிடவும்"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "தொடக்கப் பிரிவை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், இயல்புநிலை: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "பகிர்வின் இறுதிப் பகுதியை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், எ.கா: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} வரிசைப்படுத்தப்பட்ட பகிர்வுகளைக் கொண்டுள்ளது, இது அவற்றை அகற்றும், நீங்கள் உறுதியாக இருக்கிறீர்களா?"
@@ -827,3 +827,55 @@ msgstr "மீட்டமைக்க CTRL+C"
msgid "TAB to select"
msgstr "தேர்ந்தெடுக்க TAB"
+
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "குறியாக்கம் கடவுச்சொல்"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "குறியாக்கம் செய்ய வேண்டிய பகிர்வுகளைத் தேர்ந்தெடுக்கவும்"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} வரிசைப்படுத்தப்பட்ட பகிர்வுகளைக் கொண்டுள்ளது, இது அவற்றை அகற்றும், நீங்கள் உறுதியாக இருக்கிறீர்களா?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "ரூட் கடவுச்சொல்"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "தொடக்கப் பிரிவை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், இயல்புநிலை: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "பகிர்வின் இறுதிப் பகுதியை உள்ளிடவும் (சதவீதம் அல்லது தொகுதி எண், எ.கா: {}): "
diff --git a/archinstall/locales/tr/LC_MESSAGES/base.mo b/archinstall/locales/tr/LC_MESSAGES/base.mo
index 6a205da9..2e9d1258 100644
--- a/archinstall/locales/tr/LC_MESSAGES/base.mo
+++ b/archinstall/locales/tr/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/tr/LC_MESSAGES/base.po b/archinstall/locales/tr/LC_MESSAGES/base.po
index fd1e2393..f17efd3f 100644
--- a/archinstall/locales/tr/LC_MESSAGES/base.po
+++ b/archinstall/locales/tr/LC_MESSAGES/base.po
@@ -97,11 +97,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Disk bölümü için arzu edilen bir dosya systemi tipi girin"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Başlangıç kesimini girin (yüzde ya da blok numarası, varsayılan: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Disk bölümünün bitiş kesimini girin (yüzde ya da blok numarası, ör: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} işlem sırasında bekleyen disk bölümleri bulunduruyor, bu onları kaldıracak, emin misiniz?"
@@ -836,3 +836,55 @@ msgstr ""
msgid "TAB to select"
msgstr ""
+
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "Şifreleme şifresi"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "Hangi disk bölümünün şifrelenmiş olarak işaretleneceğini seçin"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} işlem sırasında bekleyen disk bölümleri bulunduruyor, bu onları kaldıracak, emin misiniz?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Root (kök) şifresi"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Başlangıç kesimini girin (yüzde ya da blok numarası, varsayılan: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Disk bölümünün bitiş kesimini girin (yüzde ya da blok numarası, ör: {}): "
diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo
index 1e0486a2..ae98dcfb 100644
--- a/archinstall/locales/uk/LC_MESSAGES/base.mo
+++ b/archinstall/locales/uk/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po
index 3589df98..ee9740fc 100644
--- a/archinstall/locales/uk/LC_MESSAGES/base.po
+++ b/archinstall/locales/uk/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "Введіть бажаний тип файлової системи для розділу"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "Введіть початковий сектор (відсоток або номер блоку, за замовчуванням: {}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "Введіть кінцевий сектор розділу (відсоток або номер блоку, наприклад: {}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} містить розділи в черзі, це видалить їх, ви впевнені?"
@@ -855,9 +855,6 @@ msgstr "Оберіть параметр шифрування диска"
msgid "Select a FIDO2 device to use for HSM"
msgstr "Оберіть пристрій FIDO2 для використання для HSM"
-msgid "Partition encryption"
-msgstr "Шифрування розділу"
-
msgid "All settings will be reset, are you sure?"
msgstr "Усі налаштування буде скинуто, ви впевнені?"
@@ -869,3 +866,12 @@ msgstr "Disk encryption"
msgid "Password"
msgstr "Пароль"
+
+msgid "Partition encryption"
+msgstr "Шифрування розділу"
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "Введіть початковий сектор (відсоток або номер блоку, за замовчуванням: {}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "Введіть кінцевий сектор розділу (відсоток або номер блоку, наприклад: {}): "
diff --git a/archinstall/locales/ur/LC_MESSAGES/base.mo b/archinstall/locales/ur/LC_MESSAGES/base.mo
index 44e38ad4..e788d932 100644
--- a/archinstall/locales/ur/LC_MESSAGES/base.mo
+++ b/archinstall/locales/ur/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/ur/LC_MESSAGES/base.po b/archinstall/locales/ur/LC_MESSAGES/base.po
index 0b024031..4e3d7a10 100644
--- a/archinstall/locales/ur/LC_MESSAGES/base.po
+++ b/archinstall/locales/ur/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "اس پارٹیشن کے لیے مطلوبہ فائل سسٹم درج کریں"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "اسٹارٹ سیکٹر درج کریں (فیصد یا بلاک نمبر، ڈیفالٹ: {}):"
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "پارٹیشن کا آخری سیکٹر درج کریں (فیصد یا بلاک نمبر، مثال کے طور پر: {}):"
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} پارٹیشنزکے گروپ پر مشتمل ہے، یہ ان کو مٹا دے گا، کیا آپ پر اعتماد ہیں؟"
@@ -858,8 +858,58 @@ msgstr ""
msgid "TAB to select"
msgstr ""
-#~ msgid "Select disk layout"
-#~ msgstr "ڈسک لے آؤٹ کو منتخب کریں"
+msgid "[Default value: 0] > "
+msgstr ""
+
+msgid "To be able to use this translation, please install a font manually that supports the language."
+msgstr ""
+
+msgid "The font should be stored as {}"
+msgstr ""
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "انکرپشن پاس ورڈ سیٹ کریں"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "منتخب کریں کہ کس پارٹیشن کو انکرپٹڈ یا خفیہ رکھنا ہے"
+
+#, fuzzy
+msgid "Select disk encryption option"
+msgstr "ڈسک لے آؤٹ کو منتخب کریں"
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} پارٹیشنزکے گروپ پر مشتمل ہے، یہ ان کو مٹا دے گا، کیا آپ پر اعتماد ہیں؟"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "روٹ پاس ورڈ"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "اسٹارٹ سیکٹر درج کریں (فیصد یا بلاک نمبر، ڈیفالٹ: {}):"
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "پارٹیشن کا آخری سیکٹر درج کریں (فیصد یا بلاک نمبر، مثال کے طور پر: {}):"
#~ msgid "Add :"
#~ msgstr "شامل:"
diff --git a/archinstall/locales/zh-CN/LC_MESSAGES/base.mo b/archinstall/locales/zh-CN/LC_MESSAGES/base.mo
index 70cb4064..693308ab 100644
--- a/archinstall/locales/zh-CN/LC_MESSAGES/base.mo
+++ b/archinstall/locales/zh-CN/LC_MESSAGES/base.mo
Binary files differ
diff --git a/archinstall/locales/zh-CN/LC_MESSAGES/base.po b/archinstall/locales/zh-CN/LC_MESSAGES/base.po
index 60f88a01..d957204b 100644
--- a/archinstall/locales/zh-CN/LC_MESSAGES/base.po
+++ b/archinstall/locales/zh-CN/LC_MESSAGES/base.po
@@ -96,11 +96,11 @@ msgstr ""
msgid "Enter a desired filesystem type for the partition"
msgstr "为分区输入所需的文件系统类型"
-msgid "Enter the start sector (percentage or block number, default: {}): "
-msgstr "输入起始扇区(百分比或块号,默认:{}): "
+msgid "Enter the start location (in parted units: s, GB, %, etc. ; default: {}): "
+msgstr ""
-msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
-msgstr "输入分区的结束扇区(百分比或块号,例如:{}): "
+msgid "Enter the end location (in parted units: s, GB, %, etc. ; ex: {}): "
+msgstr ""
msgid "{} contains queued partitions, this will remove those, are you sure?"
msgstr "{} 包含排队分区,这将删除这些分区,您确定吗?"
@@ -761,7 +761,8 @@ msgstr "您输入的用户名无效。 再试一次"
msgid "Should \"{}\" be a superuser (sudo)?"
msgstr "将 \"{}\" 设置为超级用户(sudo)吗?"
-msgid "Select which partitions to encrypt:"
+#, fuzzy
+msgid "Select which partitions to encrypt"
msgstr "选择要加密的分区:"
msgid "very weak"
@@ -834,3 +835,46 @@ msgstr "为了能够使用此翻译,请手动安装支持该语言的字体。
msgid "The font should be stored as {}"
msgstr "字体应存储为 {}"
+
+#, fuzzy
+msgid "Encryption type"
+msgstr "加密密码"
+
+msgid "Partitions"
+msgstr ""
+
+msgid "No HSM devices available"
+msgstr ""
+
+#, fuzzy
+msgid "Partitions to be encrypted"
+msgstr "选择要加密的分区:"
+
+msgid "Select disk encryption option"
+msgstr ""
+
+msgid "Select a FIDO2 device to use for HSM"
+msgstr ""
+
+#, fuzzy
+msgid "All settings will be reset, are you sure?"
+msgstr "{} 包含排队分区,这将删除这些分区,您确定吗?"
+
+msgid "Back"
+msgstr ""
+
+msgid "Disk encryption"
+msgstr ""
+
+#, fuzzy
+msgid "Password"
+msgstr "Root 密码"
+
+msgid "Partition encryption"
+msgstr ""
+
+#~ msgid "Enter the start sector (percentage or block number, default: {}): "
+#~ msgstr "输入起始扇区(百分比或块号,默认:{}): "
+
+#~ msgid "Enter the end sector of the partition (percentage or block number, ex: {}): "
+#~ msgstr "输入分区的结束扇区(百分比或块号,例如:{}): "
diff --git a/docs/examples/python.rst b/docs/examples/python.rst
index c3904863..dfc0abb3 100644
--- a/docs/examples/python.rst
+++ b/docs/examples/python.rst
@@ -35,10 +35,10 @@ To do this, we'll begin by importing `archinstall` in our `./archinstall/example
import archinstall
- all_drives = archinstall.list_drives()
- print(all_drives)
+ all_drives = archinstall.all_blockdevices(partitions=False)
+ print(list(all_drives.keys()))
-This should print out a list of drives and some meta-information about them.
+This should print out a list of drives.
As an example, this will do just fine.
Now, go ahead and install the library either as a user-module or system-wide.
diff --git a/docs/installing/guided.rst b/docs/installing/guided.rst
index b7d4db4f..4cb07ae1 100644
--- a/docs/installing/guided.rst
+++ b/docs/installing/guided.rst
@@ -115,9 +115,9 @@ Options for ``--config``
+----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| hostname | any | Hostname of machine after installation. Default will be ``archinstall`` | No |
+----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+
-| kernels | [ "kernel1", "kernel2"] | List of kernels to install eg: linux, linux-lts, linux-zen etc | At least 1 |
+| kernels | [ "kernel1", "kernel2"] | List of kernels to install eg: linux, linux-lts, linux-zen etc | At least 1 |
+----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+
-| keyboard-language | Any valid layout given by ``localectl list-keymaps`` | eg: ``us``, ``de`` or ``de-latin1`` etc. Defaults to ``us`` | No |
+| keyboard-layout | Any valid layout given by ``localectl list-keymaps`` | eg: ``us``, ``de`` or ``de-latin1`` etc. Defaults to ``us`` | No |
+----------------------+--------------------------------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------+
| mirror-region | | {"<Region Name>": { "Mirror URL": True/False}, ..} | | Defaults to automatic selection. | No |
| | | "Worldwide" or "Sweden" | | Either takes a dictionary structure of region and a given set of mirrors. | |
diff --git a/examples/guided.py b/examples/guided.py
index f0b52299..e9240c03 100644
--- a/examples/guided.py
+++ b/examples/guided.py
@@ -146,14 +146,6 @@ def perform_installation(mountpoint):
if partition.size < 0.19: # ~200 MiB in GiB
raise archinstall.DiskError(f"The selected /boot partition in use is not large enough to properly install a boot loader. Please resize it to at least 200MiB and re-run the installation.")
- # if len(mirrors):
- # Certain services might be running that affects the system during installation.
- # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist
- # We need to wait for it before we continue since we opted in to use a custom mirror/region.
- installation.log('Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO)
- while archinstall.service_state('reflector') not in ('dead', 'failed'):
- time.sleep(1)
-
# If we've activated NTP, make sure it's active in the ISO too and
# make sure at least one time-sync finishes before we continue with the installation
if archinstall.arguments.get('ntp', False):
@@ -175,6 +167,22 @@ def perform_installation(mountpoint):
installation.log(f"Waiting for timedatectl timesync-status to report a timesync against a server", level=logging.INFO)
logged = True
time.sleep(1)
+
+ # if len(mirrors):
+ # Certain services might be running that affects the system during installation.
+ # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist
+ # We need to wait for it before we continue since we opted in to use a custom mirror/region.
+ installation.log('Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO)
+ while archinstall.service_state('reflector') not in ('dead', 'failed', 'exited'):
+ time.sleep(1)
+
+ installation.log('Waiting pacman-init.service to complete.', level=logging.INFO)
+ while archinstall.service_state('pacman-init') not in ('dead', 'failed', 'exited'):
+ time.sleep(1)
+
+ installation.log('Waiting Arch Linux keyring sync (archlinux-keyring-wkd-sync) to complete.', level=logging.INFO)
+ while archinstall.service_state('archlinux-keyring-wkd-sync') not in ('dead', 'failed', 'exited'):
+ time.sleep(1)
# Set mirrors used by pacstrap (outside of installation)
if archinstall.arguments.get('mirror-region', None):
@@ -279,28 +287,6 @@ if archinstall.arguments.get('skip-mirror-check', False) is False and archinstal
archinstall.log(f"Arch Linux mirrors are not reachable. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red")
exit(1)
-if not archinstall.arguments.get('offline'):
- latest_version_archlinux_keyring = max([k.pkg_version for k in archinstall.find_package('archlinux-keyring')])
-
- # For now always update for now, we don't have the coresponding package search API
- if archinstall.arguments.get('skip-keyring-update', False) is False:
- # Then we update the keyring in the ISO environment
- if not archinstall.update_keyring32():
- log_file = os.path.join(archinstall.storage.get('LOG_PATH', None), archinstall.storage.get('LOG_FILE', None))
- archinstall.log(f"Failed to update the Arch32 keyring. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red")
- exit(1)
-
- # If we want to check for keyring updates
- # and the installed package version is lower than the upstream version
- if archinstall.arguments.get('skip-keyring-update', False) is False and \
- archinstall.installed_package('archlinux-keyring').version < latest_version_archlinux_keyring:
-
- # Then we update the keyring in the ISO environment
- if not archinstall.update_keyring():
- log_file = os.path.join(archinstall.storage.get('LOG_PATH', None), archinstall.storage.get('LOG_FILE', None))
- archinstall.log(f"Failed to update the keyring. Please check your internet connection and the log file '{log_file}'.", level=logging.INFO, fg="red")
- exit(1)
-
if not archinstall.arguments.get('silent'):
ask_user_questions()
diff --git a/profiles/budgie.py b/profiles/budgie.py
index 3e4a85df..33484680 100644
--- a/profiles/budgie.py
+++ b/profiles/budgie.py
@@ -4,12 +4,14 @@ import archinstall
is_top_level_profile = False
-# "It is recommended also to install the gnome group, which contains applications required for the standard GNOME experience." - Arch Wiki
__packages__ = [
- "budgie-desktop",
- "gnome",
+ "arc-gtk-theme",
+ "budgie",
"lightdm",
"lightdm-gtk-greeter",
+ "mate-terminal",
+ "nemo",
+ "papirus-icon-theme",
]
diff --git a/profiles/i3.py b/profiles/i3.py
index 37029a02..d9b98b77 100644
--- a/profiles/i3.py
+++ b/profiles/i3.py
@@ -1,14 +1,13 @@
-# Common package for i3, lets user select which i3 configuration they want.
+# Common package for i3.
import archinstall
-from archinstall import Menu
-from archinstall.lib.menu.menu import MenuSelectionType
is_top_level_profile = False
# New way of defining packages for a profile, which is iterable and can be used out side
# of the profile to get a list of "what packages will be installed".
__packages__ = [
+ 'i3-wm',
'i3lock',
'i3status',
'i3blocks',
@@ -27,28 +26,13 @@ def _prep_function(*args, **kwargs):
for more input before any other installer steps start.
"""
- supported_configurations = ['i3-wm', 'i3-gaps']
-
- choice = Menu('Select your desired configuration', supported_configurations).run()
-
- if choice.type_ != MenuSelectionType.Selection:
- return False
-
- if choice.value:
- # Temporarily store the selected desktop profile
- # in a session-safe location, since this module will get reloaded
- # the next time it gets executed.
- archinstall.storage['_i3_configuration'] = choice.value
-
- # i3 requires a functioning Xorg installation.
- profile = archinstall.Profile(None, 'xorg')
- with profile.load_instructions(namespace='xorg.py') as imported:
- if hasattr(imported, '_prep_function'):
- return imported._prep_function()
- else:
- print('Deprecated (??): xorg profile has no _prep_function() anymore')
-
- return False
+ # i3 requires a functioning Xorg installation.
+ profile = archinstall.Profile(None, 'xorg')
+ with profile.load_instructions(namespace='xorg.py') as imported:
+ if hasattr(imported, '_prep_function'):
+ return imported._prep_function()
+ else:
+ print('Deprecated (??): xorg profile has no _prep_function() anymore')
if __name__ == 'i3':
@@ -65,17 +49,11 @@ if __name__ == 'i3':
this is therefore just a helper to get started
"""
- # Install common packages for all i3 configurations
- archinstall.storage['installation_session'].add_additional_packages(__packages__[:4])
-
# Install dependency profiles
archinstall.storage['installation_session'].install_profile('xorg')
- # gaps is installed by default so we are overriding it here with lightdm
- archinstall.storage['installation_session'].add_additional_packages(__packages__[4:])
+ # Install the i3 packages
+ archinstall.storage['installation_session'].add_additional_packages(__packages__)
- # Auto start lightdm for all users
+ # Enable autostart of lightdm for all users
archinstall.storage['installation_session'].enable_service('lightdm')
-
- # install the i3 group now
- archinstall.storage['installation_session'].add_additional_packages(archinstall.storage['_i3_configuration'])
diff --git a/profiles/sway.py b/profiles/sway.py
index b7266da3..5fbd3365 100644
--- a/profiles/sway.py
+++ b/profiles/sway.py
@@ -1,6 +1,12 @@
# A desktop environment using "Sway"
+from typing import Any, TYPE_CHECKING
+
import archinstall
from archinstall import Menu
+from archinstall.lib.menu.menu import MenuSelectionType
+
+if TYPE_CHECKING:
+ _: Any
is_top_level_profile = False
@@ -22,7 +28,7 @@ def _check_driver() -> bool:
packages = archinstall.storage.get("gfx_driver_packages", [])
if packages and "nvidia" in packages:
- prompt = 'The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?'
+ prompt = _('The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues, are you okay with that?')
choice = Menu(prompt, Menu.yes_no(), default_option=Menu.no(), skip=False).run()
if choice.value == Menu.no():
@@ -30,6 +36,18 @@ def _check_driver() -> bool:
return True
+def _get_system_privelege_control_preference():
+ # need to activate seat service and add to seat group
+ title = str(_('Sway needs access to your seat (collection of hardware devices i.e. keyboard, mouse, etc)'))
+ title += str(_('\n\nChoose an option to give Sway access to your hardware'))
+ choice = Menu(title, ["polkit", "seatd"]).run()
+
+ if choice.type_ != MenuSelectionType.Selection:
+ return False
+
+ archinstall.storage['sway_sys_priv_ctrl'] = [choice.value]
+ archinstall.arguments['sway_sys_priv_ctrl'] = [choice.value]
+ return True
def _prep_function(*args, **kwargs):
"""
@@ -38,6 +56,9 @@ def _prep_function(*args, **kwargs):
other code in this stage. So it's a safe way to ask the user
for more input before any other installer steps start.
"""
+ if not _get_system_privelege_control_preference():
+ return False
+
driver = archinstall.select_driver()
if driver:
@@ -49,15 +70,29 @@ def _prep_function(*args, **kwargs):
return False
+"""
+def _post_install(*args, **kwargs):
+ if "seatd" in sway_sys_priv_ctrl:
+ print(_('After booting, add user(s) to the `seat` user group and re-login to use Sway'))
+ return True
+"""
+
# Ensures that this code only gets executed if executed
# through importlib.util.spec_from_file_location("sway", "/somewhere/sway.py")
# or through conventional import sway
if __name__ == "sway":
if not _check_driver():
- raise archinstall.lib.exceptions.HardwareIncompatibilityError("Sway does not support the proprietary nvidia drivers.")
+ raise archinstall.lib.exceptions.HardwareIncompatibilityError(_('Sway does not support the proprietary nvidia drivers.'))
# Install the Sway packages
archinstall.storage['installation_session'].add_additional_packages(__packages__)
+ if "seatd" in archinstall.storage['sway_sys_priv_ctrl']:
+ archinstall.storage['installation_session'].add_additional_packages(['seatd'])
+ archinstall.storage['installation_session'].enable_service('seatd')
+ elif "polkit" in archinstall.storage['sway_sys_priv_ctrl']:
+ archinstall.storage['installation_session'].add_additional_packages(['polkit'])
+ else:
+ raise archinstall.lib.exceptions.ProfileError(_('Sway requires either seatd or polkit to run'))
# Install the graphics driver packages
archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(archinstall.storage.get('gfx_driver_packages', None))}")
diff --git a/pyproject.toml b/pyproject.toml
index 207dace5..6e0fcb99 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,24 +1,24 @@
[build-system]
-requires = ["flit_core >=3.5.1,<4", "setuptools>=45", "wheel"]
-build-backend = "flit_core.buildapi"
+requires = ["setuptools>=67.5"]
+build-backend = "setuptools.build_meta"
[project]
name = "archinstall"
-dynamic = ["version"]
+dynamic = ["version", "entry-points"]
description = "Arch Linux installer - guided, templates etc."
authors = [
{name = "Anton Hvornum", email = "anton@hvornum.se"},
]
+license = {text = "GPL-3.0-only"}
readme = "README.md"
requires-python = ">=3.10"
keywords = ["linux", "arch", "archinstall", "installer"]
classifiers = [
- "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
- "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
+ "Programming Language :: Python :: 3.10",
"Operating System :: POSIX :: Linux",
]
@@ -27,20 +27,29 @@ Home = "https://archlinux.org"
Documentation = "https://archinstall.readthedocs.io/"
Source = "https://github.com/archlinux/archinstall"
+[project.optional-dependencies]
+doc = ["sphinx"]
+
[project.scripts]
archinstall = "archinstall:run_as_a_module"
-[project.optional-dependencies]
-doc = ["sphinx"]
+[tool.setuptools]
+packages = ["archinstall", "profiles", "examples"]
+
+[tool.setuptools.package-data]
+archinstall = [
+ "examples/*.py",
+ "profiles/*.py",
+ "profiles/applications/*.py"
+]
-[tool.flit.sdist]
-include = ["docs/", "profiles", "examples", "archinstall/profiles", "archinstall/examples"]
-exclude = ["docs/*.html", "docs/_static", "docs/*.png", "docs/*.psd"]
+[tool.setuptools.dynamic]
+version = {attr = "archinstall.__version__"}
[tool.mypy]
python_version = "3.10"
exclude = "tests"
[tool.bandit]
-targets = ["ourkvm"]
+targets = ["archinstall"]
exclude = ["/tests"]
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 8c9c087e..00000000
--- a/setup.cfg
+++ /dev/null
@@ -1,39 +0,0 @@
-[metadata]
-name = archinstall
-version = attr: archinstall.__version__
-description = Arch Linux installer - guided, templates etc.
-author = Anton Hvornum
-author_email = anton@hvornum.se
-long_description = file: README.md
-long_description_content_type = text/markdown
-license = GPL
-license_files =
- LICENSE
-project_urls =
- Source = https://github.com/archlinux/archinstall
- Documentation = https://archinstall.readthedocs.io/
-classifiers =
- Programming Language :: Python :: 3
- Programming Language :: Python :: 3.8
- Programming Language :: Python :: 3.9
- License :: OSI Approved :: GNU General Public License v3 (GPLv3)
- Operating System :: POSIX :: Linux
-
-[options]
-packages = find:
-python_requires = >= 3.8
-
-[options.packages.find]
-include =
- archinstall
- archinstall.*
-
-[options.package_data]
-archinstall =
- examples/*.py
- profiles/*.py
- profiles/applications/*.py
-
-[options.entry_points]
-console_scripts =
- archinstall = archinstall:run_as_a_module
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 639e4434..00000000
--- a/setup.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import setuptools # type: ignore
-
-setuptools.setup(package_data={'archinstall': ['locales/*','locales/*/*','locales/*/*/*']}, include_package_data=True)