Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib
diff options
context:
space:
mode:
Diffstat (limited to 'archinstall/lib')
-rw-r--r--archinstall/lib/disk.py8
-rw-r--r--archinstall/lib/luks.py28
-rw-r--r--archinstall/lib/user_interaction.py12
3 files changed, 42 insertions, 6 deletions
diff --git a/archinstall/lib/disk.py b/archinstall/lib/disk.py
index 2be26585..2f3d8233 100644
--- a/archinstall/lib/disk.py
+++ b/archinstall/lib/disk.py
@@ -196,28 +196,34 @@ class Partition():
if b'UUID' not in o:
raise DiskError(f'Could not format {path} with {filesystem} because: {o}')
self.filesystem = 'btrfs'
+
elif filesystem == 'vfat':
o = b''.join(sys_command(f'/usr/bin/mkfs.vfat -F32 {path}'))
if (b'mkfs.fat' not in o and b'mkfs.vfat' not in o) or b'command not found' in o:
raise DiskError(f'Could not format {path} with {filesystem} because: {o}')
self.filesystem = 'vfat'
+
elif filesystem == 'ext4':
if (handle := sys_command(f'/usr/bin/mkfs.ext4 -F {path}')).exit_code != 0:
raise DiskError(f'Could not format {path} with {filesystem} because: {b"".join(handle)}')
self.filesystem = 'ext4'
+
elif filesystem == 'xfs':
if (handle := sys_command(f'/usr/bin/mkfs.xfs -f {path}')).exit_code != 0:
raise DiskError(f'Could not format {path} with {filesystem} because: {b"".join(handle)}')
self.filesystem = 'xfs'
+
elif filesystem == 'f2fs':
if (handle := sys_command(f'/usr/bin/mkfs.f2fs -f {path}')).exit_code != 0:
raise DiskError(f'Could not format {path} with {filesystem} because: {b"".join(handle)}')
self.filesystem = 'f2fs'
+
elif filesystem == 'crypto_LUKS':
from .luks import luks2
encrypted_partition = luks2(self, None, None)
encrypted_partition.format(path)
self.filesystem = 'crypto_LUKS'
+
else:
raise UnknownFilesystemFormat(f"Fileformat '{filesystem}' is not yet implemented.")
return True
@@ -327,7 +333,7 @@ class Filesystem():
if prep_mode == 'luks2':
self.add_partition('primary', start='513MiB', end='100%')
else:
- self.add_partition('primary', start='513MiB', end='100%', format='ext4')
+ self.add_partition('primary', start='513MiB', end='100%', format=prep_mode)
def add_partition(self, type, start, end, format=None):
log(f'Adding partition to {self.blockdevice}', level=LOG_LEVELS.Info)
diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py
index d62c2d4b..b98994ef 100644
--- a/archinstall/lib/luks.py
+++ b/archinstall/lib/luks.py
@@ -6,17 +6,28 @@ from .output import log, LOG_LEVELS
from .storage import storage
class luks2():
- def __init__(self, partition, mountpoint, password, *args, **kwargs):
+ def __init__(self, partition, mountpoint, password, key_file=None, *args, **kwargs):
self.password = password
self.partition = partition
self.mountpoint = mountpoint
self.args = args
self.kwargs = kwargs
+ self.key_file = key_file
self.filesystem = 'crypto_LUKS'
def __enter__(self):
- key_file = self.encrypt(self.partition, self.password, *self.args, **self.kwargs)
- return self.unlock(self.partition, self.mountpoint, key_file)
+ if self.partition.allow_formatting:
+ self.key_file = self.encrypt(self.partition, *self.args, **self.kwargs)
+ else:
+ if not self.key_file:
+ self.key_file = f"/tmp/{os.path.basename(self.partition.path)}.disk_pw" # TODO: Make disk-pw-file randomly unique?
+
+ if type(self.password) != bytes: self.password = bytes(self.password, 'UTF-8')
+
+ with open(self.key_file, 'wb') as fh:
+ fh.write(self.password)
+
+ return self.unlock(self.partition, self.mountpoint, self.key_file)
def __exit__(self, *args, **kwargs):
# TODO: https://stackoverflow.com/questions/28157929/how-to-safely-handle-an-exception-inside-a-context-manager
@@ -24,13 +35,20 @@ class luks2():
raise args[1]
return True
- def encrypt(self, partition, password, key_size=512, hash_type='sha512', iter_time=10000, key_file=None):
+ def encrypt(self, partition, password=None, key_size=512, hash_type='sha512', iter_time=10000, key_file=None):
# TODO: We should be able to integrate this into the main log some how.
# Perhaps post-mortem?
log(f'Encrypting {partition} (This might take a while)', level=LOG_LEVELS.Info)
if not key_file:
- key_file = f"/tmp/{os.path.basename(self.partition.path)}.disk_pw" # TODO: Make disk-pw-file randomly unique?
+ if self.key_file:
+ key_file = self.key_file
+ else:
+ key_file = f"/tmp/{os.path.basename(self.partition.path)}.disk_pw" # TODO: Make disk-pw-file randomly unique?
+
+ if not password:
+ password = self.password
+
if type(password) != bytes: password = bytes(password, 'UTF-8')
with open(key_file, 'wb') as fh:
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index 5861fff3..7e7f5873 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -97,6 +97,18 @@ def ask_for_disk_layout():
value = generic_select(options.values(), "Found partitions on the selected drive, (select by number) what you want to do: ")
return next((key for key, val in options.items() if val == value), None)
+def ask_for_main_filesystem_format():
+ options = {
+ 'btrfs' : 'btrfs',
+ 'ext4' : 'ext4',
+ 'xfs' : 'xfs',
+ 'f2fs' : 'f2fs',
+ 'vfat' : 'vfat'
+ }
+
+ value = generic_select(options.values(), "Select your main partitions filesystem by number or free-text: ")
+ return next((key for key, val in options.items() if val == value), None)
+
def generic_select(options, input_text="Select one of the above by index or absolute value: ", sort=True):
"""
A generic select function that does not output anything